Java 如何在实体上强制执行版本更新?
在我目前开发的应用程序中,我有数据结构:Java 如何在实体上强制执行版本更新?,java,jpa,spring-data-jpa,jpa-2.1,Java,Jpa,Spring Data Jpa,Jpa 2.1,在我目前开发的应用程序中,我有数据结构: Bucket [1] ------ [Many] Element 现在我有了视图,可以添加、删除和修改元素。现在我遇到了一种情况,当多个用户编辑同一个bucket时,他们可能会搞乱其他人的编辑。 我想通过每次保存数据时检查和更新bucket版本来解决这个问题 JPA有自己的版本,所以我计划重用它。但JPA在更新其元素时并不愿意更新Bucket版本。在JPA中,有没有一个好的方法来强制对实体进行版本更新 目前我发现了一
Bucket [1] ------ [Many] Element
现在我有了视图,可以添加、删除和修改元素。现在我遇到了一种情况,当多个用户编辑同一个bucket时,他们可能会搞乱其他人的编辑。
我想通过每次保存数据时检查和更新bucket版本来解决这个问题
JPA有自己的版本,所以我计划重用它。但JPA在更新其元素时并不愿意更新Bucket版本。在JPA中,有没有一个好的方法来强制对实体进行版本更新
目前我发现了一些建议,比如创建虚拟字段,拥有自己的版本字段,或者分离和合并实体。在我看来,没有一个是对的,还有更好的吗
如果这有帮助的话,我将使用eclipse链接和spring数据。您可以使用
OPTIMISTIC\u FORCE\u 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);
}
我已经在JPA中使用了这个版本,它会自动更新:这就是该功能的要点:您需要用@version注释字段(长类型)。如果版本不是好的,则抛出异常并取消最后一个事务。不要忘记使用optimist锁定,以避免长时间锁定数据库上的字段。如果许多用户在同一字段编辑,则会出现一些数据损坏。您的用户有更好的评级吗?@nafas user处理的是dto,而不是实体,并且它发生在事务之外。因此,数据损坏没有问题。并且没有用户没有任何评级。谁先救谁,谁就成功了,阻止了其他人saving@rlm谢谢,但我已经知道了,我需要的是在用户对元素进行更改时更新bucket上的版本