Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在实体上强制执行版本更新?_Java_Jpa_Spring Data Jpa_Jpa 2.1 - Fatal编程技术网

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上的版本