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

时间:2017-03-20 06:43:56

标签: java spring hibernate jpa spring-data-jpa

乐观锁定注释不起作用。

@OptimisticLocking(type = OptimisticLockType.NONE)
public class TestEntity {
    ....
}

@Lock注释也不起作用:

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

所以,我试着打电话:

entityManager.refresh();

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

EntityManager em = sharedEntityManagerBean.getObject();
em.refresh(testEntity, LockModeType.OPTIMISTIC);
testRepository.save(testEntity);

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

1 个答案:

答案 0 :(得分:2)

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

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

在您的情况下,如果您不希望对此实体进行乐观锁定,则只需删除@Version属性即可。但是,这通常是一个坏主意,因为它可能导致lost updates

也许你想使用versionless optimistic locking来降低非重叠属性通道产生的冲突率。

同样,@Lock(LockModeType.NONE)是无用的,因为默认情况下它是隐含的。你也可以删除它。这只适用于acquiring an explicit logical or physical lock

你得出了错误的结论,认为乐观锁定导致了一个你甚至无法描述的问题。

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

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