首先,我有一個無狀態Bean上做一個簡單的retreive,看起來像這樣檢索有狀態的EJB實體throught無國籍本地EJB。(使用的session-per-談話長時間的談話)
@Stateless
@LocalBean
public A {
@PersistenceContext
private EntityManager em;
public MyEntity retrieveMethod(){
em.createQuery(...).getSingleResult();
}
}
我有用於管理與遠程客戶端長談全狀態的豆,它是這樣的:來上執行em.persist(OE)
@Statefull
@LocalBean
@TransactionAttribute(NOT_SUPPORTED)
public class B implements BRemote {
@PersistenceContext(type = EXTENDED)
private EntityManager em;
@EJB
A a;
public void start(){
OtherEntity oe = new OtherEntity();
oe.setRelationMyEntitie(this.a.retrieveMethod());
em.persist(oe);
}
@TransactionAttribute(REQUIRED)
public void end(){
em.flush();
}
}
的問題。 oe引用了由另一個EntityManager加載的MyEntity實例。所以他們不知道它抱怨持續分離的實體。
我想知道什麼是有一種方法來避免這個問題。如果沒有直接的解決方案,採用什麼樣的最佳模式?
編輯:我不想就開始使用交易(),因爲在實際應用中,有狀態Bean用於實現其必須堅持在一次複雜的實體模型。我嘗試設置名爲session-per-conversation的模式,在此處描述http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/transactions.html#transactions-basics-apptx。所以如果我理解你是正確的,解決方案是「在bean B的start()方法中使用事務」,但是如果我這樣做,在方法結束時,內容被刷新到數據庫,這不是我想要的。
我能看到的其他解決方案是在B的EntityManager中獲取MyEntity,所以做一個合併或者一個em.find()或者將retrieveMethod委託給一些DAO樣式類,使用em參數和bean A ,在DA中做一個簡單的DAO委託,直接調用DAO。
任何想法是什麼是最好的方法?
何,對不起,我的錯。我在bean B上使用@PersistenceContext(type = EXTENDED),忘記在示例中寫入它。 – 2012-01-13 07:37:51
我不想在start()上使用事務,因爲在實際應用程序中,statefull bean用於實現需要一次保留的複雜實體模型。 – 2012-01-13 07:42:46
好的,在那種情況下,實體將被「收集」,直到再次與TX交互。我認爲'em.flush'仍然可以被刪除,因爲TX的存在將觸發真正的持續。 – 2012-01-13 07:52:09