我想在我的应用程序中使用实体版本控制。我知道它是如何工作的,但并不完全。我知道应该在实体中创建一个@Version
注释列,并且该对象在存储在数据库中时将具有版本1
值。对此实体中的任何字段的每次替换都将导致实体递增1。
该实体最初具有第一个版本。我获得了这个实体并替换了一个字段,但同时另一个用户也获得了这个实体,也替换了字段并快速将对象保存到数据库,将版本增加到2.所以当我想保存这个过时的对象时,如何我应该比较实体版本是否与我的对象一致
或者与本项目不同的情况。该实体有一个版本为https://github.com/Netflix/genie/blob/master/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/AuditEntity.java的列。用户可以通过发送具有版本字段的DTO对象来更新实体
private void updateEntityWithDtoContents(
final ApplicationEntity entity,
final Application dto
) throws GenieException {
entity.setVersion(dto.getVersion());
}
对象中的版本设置为https://github.com/Netflix/genie/blob/master/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/BaseEntity.java。但是,这里的版本只是一个手动设置版本的字段,只将自身写入数据库。那么如何检查Application是否是带有base的当前版本。
如何检查Application
对象是否与数据库中的ApplicationEntity
版本相同?
非常简单:使用@version注释,您不需要自己检查数据库上的值,Hibernate将为您执行此操作,如果您尝试保存过时的实体,它将引发OptimisticLockException
。
你可以阅读更多here
在锁定方面,有两种方法可以在JPA,乐观锁定和悲观锁定中实现锁定。要清楚了解这两者之间的区别,请参阅here。
@Entity
@Table(name = "orders")
public class Order {
@Id
private long id;
@Version
private int version;
private String description;
private String status;
// ... mutators
}
请注意,根据用例,版本列可能具有不同的数据类型,请参阅此信息以获取更多信息。interface WidgetRepository extends Repository<Widget, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Widget findOne(Long id);
}