了解在JPA中使用@Version注释

问题描述 投票:0回答:2

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

java spring hibernate jpa spring-boot
2个回答
1
投票

非常简单:使用@version注释,您不需要自己检查数据库上的值,Hibernate将为您执行此操作,如果您尝试保存过时的实体,它将引发OptimisticLockException

你可以阅读更多here


1
投票

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

  1. Optimistic Locking:这可以通过在表中引入版本列来实现。你只需要将@version注释放在JPA中。 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); }
© www.soinside.com 2019 - 2024. All rights reserved.