2015-04-01 59 views
0

在我的時區早上好。交易和分離對象JPA

技術:EJB 3.0 JPA提供商 - >(OpenJPA中) 容器 - > WAS 代碼的片段:

@Stateless(name = "ejb/BeanName") 
public class A implements AInterface{ 

    @PersistenceContext(unitName = "main") 
    private EntityManager emanager; 

    public String getData(D d){ 
     try{ 
     C c = new C(); 
     F f = emanager.find(F.class,d.getId());(1) 
     f.setSomeData(c);(2) 
     getMethodTwo(d,f);(3) 
     }finally{ 
      emanager.clear();(5) 
     } 

    } 

    public String getMethodTwo(D d,F f){ 
     Query q = emanager.createNativeQuery("UPDATE ..."); 
     q.executeUpdate();(4)  

    } 

} 

在我公司的項目,我更改此代碼片段。 我的更改是創建方法「getMethodTwo」和他的調用(3)。問題是在步調(4)JPA拋出一個異常,因爲有通過EntityManager加載的對象「f」 ),所以它被附加到上下文中,並且因爲在我們調用executeUpdate(4)時發生了更改,JPA將嘗試在對象「f」上運行更改的SQL語句。在我更改之前,此代碼可用,因爲有一個清晰的持久化上下文(5)。我認爲這是一種糟糕的代碼方式。我知道如果我在調用我的方法之前調用entitymanager.clear(),它會起作用,但我認爲這不是正確的解決方案和使用JPA的正確方法。我該怎麼辦 ?

問候 預先感謝

回答

1

你應該刷新對象狀態DB調用更新之前。

emanager.flush(); 

和刷新操作

emanager.refresh(f) 
+0

感謝您的回答,但問題是如果我「刷新」對「f」對象所做的更改將通過SQL語句(UPDATE和INSERT)發送到數據庫,並且「f」對象尚未準備好在語句中使用,因爲所需的字段並非全部填滿,並且會拋出CONSTRAINT NULL異常。要點是避免FLUSH。 – tt0686 2015-04-01 15:14:14

0

後的狀態我修復使用註釋TransactionAttributeType NOT_SUPPORTED問題,因爲該方法只是使SELECT語句。