不幸的是,我在我的代码中得到一个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