在我的時區早上好。交易和分離對象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的正確方法。我該怎麼辦 ?
問候 預先感謝
感謝您的回答,但問題是如果我「刷新」對「f」對象所做的更改將通過SQL語句(UPDATE和INSERT)發送到數據庫,並且「f」對象尚未準備好在語句中使用,因爲所需的字段並非全部填滿,並且會拋出CONSTRAINT NULL異常。要點是避免FLUSH。 – tt0686 2015-04-01 15:14:14