Java JPA@Version-Version在数据库中增加,但用较小的版本更新记录

Java JPA@Version-Version在数据库中增加,但用较小的版本更新记录,java,spring,hibernate,jpa,version,Java,Spring,Hibernate,Jpa,Version,我有@Version字段的实体人 当在数据库中更新时,版本会增加,一切正常,但它也允许您使用比数据库中的这个etity更小的版本进行编写。为什么呢版本应该是自动控制的,但是当我提交一个具有较低版本的实体时,数据库中的数据会更新,版本会增加1。为什么它允许我用旧版本更新记录 @Entity @RequestMapping(produces = "application/json") public class Person { @Id @GeneratedVal

我有@Version字段的实体人

当在数据库中更新时,版本会增加,一切正常,但它也允许您使用比数据库中的这个etity更小的版本进行编写。为什么呢版本应该是自动控制的,但是当我提交一个具有较低版本的实体时,数据库中的数据会更新,版本会增加1。为什么它允许我用旧版本更新记录

@Entity
@RequestMapping(produces = "application/json")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @Column(name="firstname")
    private String firstname;

    @Column(name="age")
    private int age;

    @Version
    @Column(name = "optlock" )
    private Long version;
服务

    public  void updatePerson(Person person){
        Person one = personRepository.getPersonById(person.getId());
        one.setFirstname(person.getFirstname());
        one.setAge(person.getAge());
        one.setVersion(person.getVersion());
        personRepository.save(one);
    }
我向我的控制器发送JSON

{
    "id": 1,
    "firstname": "Thomas",
    "age": 37,
    "version": 2
}
但在数据库中,我有一条id=1的记录,版本为3 并且更新成功。版本不受控制,不会引发异常。 更新后,版本变为=4


为什么?

根据JPA规范,Hibernate不允许手动设置托管实体的版本

请参见(hibernate文档的第2.2.1.2节:

如果要在版本低于预期时抛出乐观锁定,可以执行以下操作:

public void updatePerson(个人){
//确保您试图更新的人存在(例如:existsById)
personRepository.save(person);
}

如果person version属性低于DB中的值,hibernate将引发乐观锁定异常。

通常,您的版本字段不应该有setter;它应该是自动管理的。chrylis-小心优化谢谢