J2EEアプリケーションでは、EJB-3ステートフルBeanを使用して、フロントコードが永続エンティティ(JPA-2で管理)を作成、変更、保存できるようにします。拡張PersistenceContextでEntityManagerを手動でflush()する必要があるのはなぜですか?
それはこのようなものになります。早すぎるコミットを避けるために、
@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();
}
}
非常に重要な、唯一0メソッドは、トランザクション内にあるので、我々はcreate()
を呼び出す場合、我々は、データベースに何も挿入しません。
奇妙なことに、save()
メソッドでは、実際にデータベースにヒットするには、em.flush()
を呼び出す必要があります。実際、私は、em.isOpen()
またはem.getFlushMode()
と呼ぶこともできますが、「em関連」であることを確認しました。
私はこの点を理解していません。 save()
はトランザクション内にあるので、メソッドの最後にトランザクションがコミットされると考えて、永続的なエンティティマネージャが自動的にフラッシュしました。手動でフラッシュする必要があるのはなぜですか?あなたが拡張永続コンテキストを使用する場合は
おかげで、 ザビエル
'flush()'は必要ありません。 'joinTransaction()'はあなたのトランザクションメソッドに変更を保存するのに十分なはずです。 –