如何在 Spring Data JPA 中禁用乐观锁定

pil*_*oon 3 java spring hibernate jpa spring-data-jpa

乐观锁注释不起作用。

@OptimisticLocking(type = OptimisticLockType.NONE)
public class TestEntity {
    ....
}
Run Code Online (Sandbox Code Playgroud)

并且@Lock注释也不起作用:

public interface TestRepository<TestEntity, Long> extends JpaRepository<Version, Long> {
    @Lock(LockModeType.NONE)
    TestEntity findByName(String name);
}
Run Code Online (Sandbox Code Playgroud)

所以,我尝试打电话:

entityManager.refresh();
Run Code Online (Sandbox Code Playgroud)

它有效,但它是一个解决方法。

EntityManager em = sharedEntityManagerBean.getObject();
em.refresh(testEntity, LockModeType.OPTIMISTIC);
testRepository.save(testEntity);
Run Code Online (Sandbox Code Playgroud)

您能告诉我为什么乐观锁注释不起作用以及使用最新数据更新数据库行(实体)的最佳方法是什么?

Vla*_*cea 5

禁用OptimisticLockType.NONE默认的乐观锁定机制TestEntity

但是,只有当您从用或@Version注释的基类继承该属性时,这才有用。@MappedSuperclass@Inheritance

在您的情况下,@Version如果您不希望对该实体进行乐观锁定,则可以简单地删除该属性。然而,这通常是一个坏主意,因为它可能会导致更新丢失

也许您想使用无版本乐观锁定,它可以降低非重叠属性更改产生的冲突率。

同样,@Lock(LockModeType.NONE)是无用的,因为它是默认暗示的。您也可以删除它。这仅用于获取显式逻辑或物理锁

您得出了错误的结论,认为乐观锁定导致了您甚至没有描述的问题。

因此,您需要以适当的方式提出问题,以便清楚:

  1. 您想要解决的实际问题是什么?
  2. 你想要乐观锁吗?
  3. 进行保存时是否遇到特定异常?