如何在实体上强制执行版本更新?

时间:2015-10-29 16:10:49

标签: java jpa spring-data-jpa jpa-2.1

在我正在开发的应用程序中,我有数据结构:

                  Bucket [1] ------ [Many] Element

现在我可以添加删除和修改元素了。现在我有多个用户正在编辑相同的存储桶的情况,他们可以搞砸其他编辑。 我想通过每次保存数据时检查和更新存储桶版本来解决此问题。

JPA有自己的版本,所以我打算重用它。但是当JPA元素更新时,JPA心甘情愿地不会更新Bucket版本。有没有一种很好的方法如何在JPA中对实体实施版本更新?

目前我发现了一些建议,比如创建虚拟字段,拥有自己的版本字段,或者分离和合并实体。不是他们似乎对我来说,是否更好?

如果有帮助,我正在使用带有弹簧数据的eclipse链接。

1 个答案:

答案 0 :(得分:5)

当关系发生更改时(即添加和删除一对多集合对象中的元素),您可以使用OPTIMISTIC_FORCE_INCREMENT锁定强制更新Bucket实体。如果在不知道关系更新的情况下进行更改,这将导致任何其他持久性上下文中的任何更新失败。

示例:

public void addElement(int bucketId, Element element) {
    Bucket bucket = em.find(Bucket.class, bucketId);
    em.lock(bucket, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
    bucket.add(element);
    element.setBucket(bucket);
}