在我們的J2EE應用程序中,我們使用EJB-3有狀態bean來允許前端代碼創建,修改和保存持久實體(通過JPA-2進行管理)。爲什麼我們必須在擴展的PersistenceContext中手動刷新()EntityManager?
它看起來是這樣的:
@LocalBean
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEntityController implements Serializable
{
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
private MyEntity current;
public void create()
{
this.current = new MyEntity();
em.persist(this.current);
}
public void load(Long id)
{
this.current = em.find(MyEntity.class, id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void save()
{
em.flush();
}
}
非常重要,以避免太早提交,只有save()
方法是在一個事務中,所以如果我們調用create()
,我們插入沒有在數據庫中。
奇怪的是,在save()
方法中,我們必須調用em.flush()
才能真正擊中數據庫。事實上,我試過並發現我們也可以撥打em.isOpen()
或em.getFlushMode()
,以及任何與「時間相關」的東西。
我不明白這一點。由於save()
處於事務中,我認爲在該方法結束時,事務將被提交,因此持久化實體管理器會自動刷新。爲什麼我必須手動刷新它?
感謝, 澤維爾
不需要'flush()'。 'joinTransaction()'應該足以在你的事務性方法中保存你的修改。 –