JPA @Version 版本 - 在数据库中增加,但使用较小的版本更新记录
JPA @Version Version - increases in the database, but gives an update to the record with a smaller version
我有带有@Version 字段的实体 Person
在数据库中更新时,版本增加,一切正常,但它也允许您使用比数据库中的这个实体更小的版本来编写。为何如此?版本应该是自动控制的,但是当我提交一个低版本的实体时,更新了数据库中的数据,版本增加了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 不允许手动设置托管实体的版本。
请参阅(休眠文档的第 2.2.1.2 节:https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html
如果你想在版本低于预期时抛出乐观锁,你可以这样做:
public void updatePerson(Person person){
// ensure the person you trying to update exists (eg: existsById )
personRepository.save(person);
}
如果person版本属性低于数据库中的版本,hibernate将抛出一个乐观锁异常。
我有带有@Version 字段的实体 Person
在数据库中更新时,版本增加,一切正常,但它也允许您使用比数据库中的这个实体更小的版本来编写。为何如此?版本应该是自动控制的,但是当我提交一个低版本的实体时,更新了数据库中的数据,版本增加了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 不允许手动设置托管实体的版本。
请参阅(休眠文档的第 2.2.1.2 节:https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html
如果你想在版本低于预期时抛出乐观锁,你可以这样做:
public void updatePerson(Person person){
// ensure the person you trying to update exists (eg: existsById )
personRepository.save(person);
}
如果person版本属性低于数据库中的版本,hibernate将抛出一个乐观锁异常。