@Version注释如何在JPA中起作用?
我找到了各种答案,摘录如下:
JPA使用实体中的版本字段来检测对同一数据存储记录的并发修改.当JPA运行时检测到同时修改同一记录的尝试时,它会向尝试最后提交的事务抛出异常.
但我仍然不确定它是如何工作的.
同样来自以下几行:
您应该考虑版本字段不可变.更改字段值具有未定义的结果.
这是否意味着我们应该将我们的版本字段声明为final?
我正在尝试使用My Entity bean进行CRUD操作.CRUDRepository提供标准的方法find,delete而save但它有没有像一般的方法saveOrUpdate(Entity entity)是依次呼叫Hibernate或HibernateTemplate会话saveorUpdate()的方法.
CRUDRepository提供此功能的方式就是这样使用
@Modifying
@Query("UPDATE Space c SET c.owner = :name WHERE c.id = :id")
Integer setNameForId(@Param("name") String name, @Param("id")
Run Code Online (Sandbox Code Playgroud)
但这不是通用的,需要为完整的表单字段编写.如果有任何方法或者我可以获得Hibernate的会话或Spring HibernateTemplate的对象来解决这个问题,请告诉我.
所以我查看了有关使用Spring Data的JPA的各种教程,这在很多场合都有所不同,我不太确定正确的方法是什么.
假设有以下实体:
package stackoverflowTest.dao;
import javax.persistence.*;
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
public Customer(String name) {
this.name = name;
}
public Customer() {
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
我们还有一个DTO,它在服务层中检索,然后交给控制器/客户端.
package stackoverflowTest.dto;
public class CustomerDto {
private long id;
private String name; …Run Code Online (Sandbox Code Playgroud) 我有一个DTO:
public class UserDto {
private Long id;
private String name;
}
Run Code Online (Sandbox Code Playgroud)
和Controller:
@RestController
@RequestMapping("user")
public Class UserController {
@PostMapping(value = "{id}")
public String update(@PathVariable String id, @RequestBody UserDto userDto){
userDto.setId(id);
service.update(userDto);
}
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢手动放置IDfrom @PathVariableto DTO: userDto.setId(id);。
对于/user/5带有 body: 的POST 请求,{ name: "test" }我如何自动设置IDin DTO,以便您获得DTO如下效果?
{
id: 5,
name: "test"
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想要这样的东西:
{
id: 5,
name: "test"
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
谢谢!:)
编辑:这是一个老问题,仍然没有答案,所以我想为这个问题添加新的观点。 …