Java 有没有办法避免HibernateOptimisticLockingFailureException?

Java 有没有办法避免HibernateOptimisticLockingFailureException?,java,database,hibernate,jpa,optimistic-locking,Java,Database,Hibernate,Jpa,Optimistic Locking,我在hibernate中有一个持久的hibernate托管的@entity Obj,其中包括字段id、字段a和字段B 在某些类中,我有两个@Transactional方法,updateA()和updateB() updateA()通过其id获取Obj,进行一些处理,并更新其字段A。 updateB对fieldB执行相同的操作 我还有两个客户不断地提出请求。 一个客户端总是发出调用updateA()的请求,另一个客户端总是调用updateB()。 它们都传递现有Obj的相同id 考虑到每个方法更新

我在hibernate中有一个持久的hibernate托管的@entity Obj,其中包括字段id、字段a和字段B

在某些类中,我有两个@Transactional方法,updateA()和updateB() updateA()通过其id获取Obj,进行一些处理,并更新其字段A。
updateB对fieldB执行相同的操作

我还有两个客户不断地提出请求。 一个客户端总是发出调用updateA()的请求,另一个客户端总是调用updateB()。
它们都传递现有Obj的相同id

考虑到每个方法更新不同的字段,有没有办法避免不断发生的HibernateOptimisticLockingFailureException,或者一次成功地处理它?某种合并

为了完成这幅图,调用updateA()的线程实际上调用了与updateA()类似的其他事务方法,但没有一个更新fieldB


起初,我只是试图捕获异常并再次尝试该操作。但有时第二次也会失败。。。这似乎不是一个好的解决方案。

如果您可以安全地执行此操作,最简单的方法是从乐观锁定中排除
fieldB

import org.hibernate.annotations.OptimisticLock;

/* ... */

@OptimisticLock(excluded=true)
private B fieldB;

如果您可以安全地执行此操作,最简单的方法是从乐观锁定中排除
fieldB

import org.hibernate.annotations.OptimisticLock;

/* ... */

@OptimisticLock(excluded=true)
private B fieldB;
你可以使用

为此,您需要添加以下依赖项:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>db-util</artifactId>
    <version>0.0.1</version>
</dependency>
你可以使用

为此,您需要添加以下依赖项:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>db-util</artifactId>
    <version>0.0.1</version>
</dependency>

您是否在实体上使用版本控制(
@Version
),而不是使用@Version。将了解您是否在实体上使用版本控制(
@Version
),而不是使用@Version。Will会读到如果两个客户端同时更新fieldB不会失败吗?@Thomastets以什么方式失败?好吧,我错过了他只有一个客户端更新fieldB的事实。但是,如果有更多的客户端,一个客户端可以覆盖另一个客户端的更新,而不会被Hibernate注意到。@ThomasStets是的。这就是为什么我说“如果你能安全地做到的话”。我有一个类似的案例更新用户的最后访问时间。在这里,这并不重要,因为在并发更新的情况下,两个值之间的实际差异最差不过几秒钟。这取决于您如何执行
updateB
。如果执行完整对象保存,则为“是”。如果你只更新一个字段,不。如果两个客户端同时更新fieldB,那不会失败吗?@ThomasStets以什么方式失败?好吧,我错过了他只有一个客户端更新fieldB的事实。但是,如果有更多的客户端,一个客户端可以覆盖另一个客户端的更新,而不会被Hibernate注意到。@ThomasStets是的。这就是为什么我说“如果你能安全地做到的话”。我有一个类似的案例更新用户的最后访问时间。在这里,这并不重要,因为在并发更新的情况下,两个值之间的实际差异最差不过几秒钟。这取决于您如何执行
updateB
。如果执行完整对象保存,则为“是”。如果只更新一个字段,则不会。