2014-01-20 54 views
1

javax.persistence.EntityManager#contains(Object) method's documentation说(部分):查看任意对象是否为JPA实体的正确方法是什么?

检查实例是属于当前的持久化上下文管理实体实例。 抛出: IllegalArgumentException - 如果不是实体

JPA 2.1 specification 3.1.1表示:

运行时异常[例如IllegalArgumentException]由EntityManager接口的方法[例如抛出作为contains(Object)]而不是LockTimeoutException将导致当前事务被标记为回滚,如果持久化上下文被加入到该事务。

那么,什么是检查任意对象(不知道它是否是实体,不知道它是否在持久化上下文中)既是实体又是持久化上下文的首选方法没有回滚当前的交易?

+0

在什么情况下你:Java EE或SE?如果EE,你使用什么应用程序服务器无论你的环境如何,你是否尝试过我的代码(可能适用于SE)? –

+0

GlassFish 3.1.2.2附带的EclipseLink。在一个任意的非实体对象上调用'contains()'会把事务回滚,除非我丢失或者混淆了某些东西。 –

+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规范中也有规定。

相关问题