2011-10-04 27 views
1

我有容器管理事務無狀態會話Bean。我想在創建(保留)數據庫後返回非託管實體。這就是我要做的事:爲什麼實體無法找到,如果我堅持後分離

@Stateless 
public class MyBean { 

    @EJB(name="MyController") 
    private MyController myController; 

    public MyEntity create(MyEntity entity) { 
     //... 
     myController.create(entity); 
     myController.preTransfer(entity); 
     return entity; 
    } 
} 
@Stateless 
public class MyController { 

    @PersistenceContext(unitName = "myPU") 
    private EntityManager em; 

    public void create(MyEntity entity) { 
     //... 
     em.persist(entity); 
    } 

    public void preTransfer(MyEntity entity) { 
     if (em.contains(entity)) { 
      em.detach(entity); 
     } 
     //... 
    } 
} 

我打電話MyBean.create,實體成功堅持和MyBean.create返回非託管的實體,這是確定。但下一次當我嘗試通過id檢索此實體時,找不到它。如果我評論detach,可以找到實體,但是MyBean.create在這種情況下返回管理實體。我錯在哪裏?

回答

2

EntityManager.detach狀態的Javadoc:

未刷新的變化對實體作出如有(包括去除 實體),將不會被

所以你同步到數據庫堅持下去,然後分開。但是與persist相關的操作尚未被刷新,因此實體不會保存到數據庫中。

爲什麼你想分離它?一旦交易結束,它將自動分離。

+0

我需要分離實體,因爲我需要在從業務方法返回之前設置實體的某些字段 –

+0

聽起來像要返回數據傳輸對象而不是實體。爲什麼你會返回一個不代表數據庫狀態的實體? –

+0

@TuukkaMustonen只是爲了獲得分離的實體而引入DTO是一個非常糟糕的主意,除非它是EJB 2.1或更早的版本(但它不在這裏)。你爲什麼認爲實體是可序列化的? – MaDa

0

修訂JB的回答是:你還可使用清潔,標準的機制,而不強制容器分離或明確刷新:

@Stateless 
public class MyController { 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public MyEntity create(MyEntity entity) { 
     //... 
     em.persist(entity); 
     return entity; 
    } 
} 

你會得到一個分離的實體結果。

+0

好的,這將在這種情況下工作。但JPA不支持嵌套事務,這就是爲什麼在更復雜的情況下這不起作用。 例如,我想創建任何其他實體,與它們一起處於非託管狀態,並且它們都在同一個事務中。 –

相關問題