我想在我的应用程序中使用实体版本控制。我知道它是如何工作的,但并不完全。我知道应该在实体中创建@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
的版本是否相同?
答案 0 :(得分:1)
非常简短:
使用@version注释,您不需要自己检查数据库上的值,Hibernate将为您执行此操作,如果您尝试保存过时的实体,它将引发const labels = require("../locale/en-us/labels.json");
console.log(labels);
。
您可以阅读更多here
答案 1 :(得分:1)
在锁定时,有两种方法可以在JPA中实现锁定,乐观锁定& 悲观锁定。要清楚了解这两者之间的区别,请参阅here。
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
}
请注意,根据用例,版本列可能具有不同的数据类型,请参阅此信息以获取更多信息。
Pessimistic Locking:可以使用 @Lock 注释来实现。示例代码如下
interface WidgetRepository extends Repository<Widget, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Widget findOne(Long id);
}