2014-01-20 81 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規範中也有規定。

相關問題