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

use*_*383 2 java jpa spring-data-jpa jpa-2.1

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

                  Bucket [1] ------ [Many] Element
Run Code Online (Sandbox Code Playgroud)

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

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

目前我发现了一些建议,比如创建虚拟字段,拥有自己的版本字段,或者分离和合并实体.他们似乎没有对我好,有什么更好的吗?

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

Ish*_*Ish 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);
}
Run Code Online (Sandbox Code Playgroud)