了解在JPA中使用@Version注释

时间:2017-12-18 20:14:23

标签: java spring hibernate jpa spring-boot

我想在我的应用程序中使用实体版本控制。我知道它是如何工作的,但并不完全。我知道应该在实体中创建@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的版本是否相同?

2 个答案:

答案 0 :(得分:1)

非常简短: 使用@version注释,您不需要自己检查数据库上的值,Hibernate将为您执行此操作,如果您尝试保存过时的实体,它将引发const labels = require("../locale/en-us/labels.json"); console.log(labels);

您可以阅读更多here

答案 1 :(得分:1)

在锁定时,有两种方法可以在JPA中实现锁定,乐观锁定& 悲观锁定。要清楚了解这两者之间的区别,请参阅here

  1. Optimistic Locking:可以通过在表格中引入版本列来实现。您只需要在JPA中添加 @version 注释即可。 Hibernate将处理所有繁重的工作。示例代码段如下

    @Entity
    @Table(name = "orders")    
    public class Order {
       @Id
       private long id;
    
       @Version
       private int version;
    
       private String description;
    
       private String status;
    
       // ... mutators
    }
    

    请注意,根据用例,版本列可能具有不同的数据类型,请参阅此信息以获取更多信息。

  2. Pessimistic Locking:可以使用 @Lock 注释来实现。示例代码如下

    interface WidgetRepository extends Repository<Widget, Long> {
    
       @Lock(LockModeType.PESSIMISTIC_WRITE)
       Widget findOne(Long id);
    }