JPA乐观锁不适用于@Id上的@Version

时间:2019-04-30 13:44:25

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

我正在开发一个需要使用JPA实现乐观锁定的应用程序。这是一个已经开发的应用程序,我需要调整代码以制定一种乐观的锁定方法。根据在线JPA文档,我已经阅读到使用@Version标记有助于乐观锁定。但是,它涉及使用附加列。因此,我将版本添加到了自动生成的@Id中,如下所示,

@Version @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "data") private Long dataId;

我正在使用扩展JPARepository来实现我的存储库类。我还添加了@Lock标记,以便在存储库类中实现乐观保存,如下所示,

@Lock(LockModeType.OPTIMISTIC) @Override <S extends Data> S save(S entity);

我使用TransactionTemplate编写了一些测试用例以进行不同的事务,当我运行测试用例时,出现了以下异常,

  

org.springframework.dao.CannotAcquireLockException:无法执行语句; SQL [n / a];嵌套的异常是org.hibernate.exception.LockTimeoutException:无法执行语句       在org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:250)       在org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:225)       在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527)       在org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)       在org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)       在org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)       在org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135)

任何人都可以帮助我获得有关数据插入的乐观锁定方法的指导或建议吗?

0 个答案:

没有答案