不幸的是,我在我的代碼中得到一個OptimisticLockException,我不知道爲什麼。也許有人可以幫助我解答一般性問題。EJB - 使用一個EntityManager - 可以找到一個實體導致一個OptimisticLockException
以下情形:
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Integer id;
@Version
private int version;
private String value;
}
@Singleton
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MyBean {
@PersistenceContext
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void test() {
MyEntity myEntity = em.find(MyEntity.class, 1);
}
}
CMT使用。方法test()需要一個新的事務。
現在我的問題:如果在另一個bean中有另一個線程使用相同的持久化上下文在提交之前更改我的實體,那麼方法test()會拋出一個OptimisticLockException,儘管我只使用find並且不更新我的方法test中的任何東西)?
你是如何獲得EntityManager的?它們通常不是線程安全的 - 大多數容器在啓動事務時將在代理EM後面獲得新的EntityManager,因此您可能需要檢查您的配置。 – Chris