javax.persistence.EntityManager#contains(Object)
method's documentation说(部分):
检查实例是否是属于当前持久性上下文的托管实体实例。 的抛出:
IllegalArgumentException
- 如果不是实体
JPA 2.1 specification的第3.1.1节说:
除
IllegalArgumentException
以外的EntityManager
接口[例如contains(Object)
]的方法引发的运行时异常[例如LockTimeoutException
]将导致当前事务成为如果持久化上下文已加入该事务,则标记为回滚。
然后,检查一个任意对象(不知道它是否是一个实体,不知道它是否在持久化上下文中)既是一个实体又是一个持久化上下文而不回滚的首选方法是什么?目前的交易?
答案 0 :(得分:0)
您可以在新交易中检查,这不会影响您当前的交易。
一些通知 这是您上一个问题的一个很好的例子,当我回答说规范的某些部分没有正确制定时。我将举一个例子,它没有任何问题,与规范相矛盾(至少在JBoss 7.1和Hibernate中):
public class EjbServiceBean implement EjbService {
@PersistenceContext
private EntityManager em;
@Override
public void testTransaction() {
//this code is in a transaction EJB method
MyEntity entity = em.find(MyEntity.class, 1L);
entity.setPeristentField("New Value");
try {
em.find(Class.class, 1);//should rollback the transaction
} catch (Exception e) {
//simply catching the Exception, so that the CMT transaction is not rolled back by the EJB container.
}
//but after the method returns, the entity instance is commited.
}
}
通过这个例子,我的意思是你可以在实践中使用em.contains()
方法来检查一个类是否是一个实体类。
PS:这也在2.0规范中指定。