查看任意对象是否为JPA实体的正确方法是什么?
报告(部分)说: 检查实例是否是属于当前持久性上下文的托管实体实例。 抛出:查看任意对象是否为JPA实体的正确方法是什么?,jpa,Jpa,报告(部分)说: 检查实例是否是属于当前持久性上下文的托管实体实例。 抛出: IllegalArgumentException-如果不是实体 本协议第3.1.1节规定: 如果持久性上下文加入到当前事务,则由EntityManager接口[例如contains(Object)]的方法引发的运行时异常[例如IllegalArgumentException]将导致当前事务标记为回滚 那么,在不回滚当前事务的情况下,检查任意对象(不知道它是否是实体,不知道它是否在持久性上下文中)是否同时是实体和持久性上
IllegalArgumentException
-如果不是实体
本协议第3.1.1节规定:
如果持久性上下文加入到当前事务,则由EntityManager
接口[例如contains(Object)
]的方法引发的运行时异常[例如IllegalArgumentException
]将导致当前事务标记为回滚
那么,在不回滚当前事务的情况下,检查任意对象(不知道它是否是实体,不知道它是否在持久性上下文中)是否同时是实体和持久性上下文的首选方法是什么,这不会影响您当前的交易
一些注意事项 这是你最后一个问题的一个很好的例子,当我回答规范的某些部分没有正确的表述时。我将给您举一个例子,它可以毫无问题地工作,这与规范相矛盾(至少在JBoss 7.1和Hibernate中是这样): 在这个示例中,我的意思是您实际上可以使用
em.contains()
方法来检查类是否为实体类
PS:这在2.0规范中也有规定。您是在什么上下文中使用Java EE还是SE?如果是EE,无论您的环境如何,您都使用什么应用程序服务器?您是否尝试过我的代码(如果是SE,可能会进行修改)?GlassFish 3.1.2.2附带的EclipseLink。在任意非实体对象上调用
contains()
将回滚事务,除非我丢失或混淆了某些内容。即使立即捕获到异常?您完全尝试过我的代码吗?请使用静态元模型,cf。
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.
}
}