我在stackoverflow上搜索过,希望这不是重复的问题。
我第一次尝试乐观锁定,使用spring管理的LockModeType可以实现,但是我无法自己定义LockMode。
以下是代码示例:
我正在使用注入的持久化上下文:
@PersistenceContext
private EntityManager entityManager;
第一种方法:使用注释式事务
@Transactional
public void updateUserProfile(UserProfile userProfile) {
entityManager.lock(userProfile, LockModeType.OPTIMISTIC); // 1*
entityManager.merge(userProfile);
}
第一个异常: java.lang.IllegalArgumentException: 实体不在持久化上下文中
第二个方法:管理事务
public void updateUserProfile(UserProfile userProfile) {
entityManager.getTransaction().begin(); // 2*
entityManager.lock(userProfile, LockModeType.OPTIMISTIC);
entityManager.merge(userProfile);
entityManager.getTransaction().commit();
}
第二个异常: 不允许在共享EntityManager上创建事务 - 请改用Spring事务或EJB CMT
第三种方法:由于我遇到了使用共享EntityManager的异常,因此我尝试从entityManagerFactory创建EntityManager。
@Transactional
public void updateUserProfile(UserProfile userProfile) {
EntityManager em = entityManager.getEntityManagerFactory().createEntityManager();
em.getTransaction().begin();
em.lock(userProfile, LockModeType.OPTIMISTIC); // 3*
em.merge(userProfile);
em.getTransaction().commit();
}
第3个异常:实体不在持久化上下文中
在我的应用程序上下文中,我使用org.springframework.orm.jpa.JpaTransactionManager
来定义transactionManager
,并使用org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
来定义entityManagerFactory
提前感谢!
META-INT/persistence.xml
中。 - Abhinav Sarkar