10.3. Seam 管理永続コンテキスト
Seam を Java EE 5 環境外で使用している場合、 コンテナによる永続コンテキストのライフサイクルの管理は期待できません。EE 5 環境であっても、複雑なアプリケーションの疎結合コンポーネント間で永続コンテキストを伝播することは容易ではなく、エラーが発生しやすいことがあります。
この場合、 コンポーネントで 管理永続コンテキスト (JPA 用) または 管理セッション (Hibernate 用) のいずれかを使用する必要があります。 Seam 管理永続コンテキストは単に対話コンテキストの
EntityManager または Session のインスタンスを管理する組み込みの Seam コンポーネントです。 @In でインジェクトすることができます。
Seam 管理永続コンテキストはクラスタ環境で非常に効率的です。Seam は EJB3 の仕様ではできないコンテナ管理永続コンテキストの最適化を実行することができます。 ノード間の永続コンテキストの状態を複製することなく拡張永続コンテキストの透過的なフェールオーバーをサポートします (この点については、EJB 仕様の次回のリビジョンで修正したいと考えています)。
10.3.1. JPA での Seam 管理永続コンテキストの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
管理永続コンテキストの設定は簡単です。
components.xml 内に次のように記述します。
<persistence:managed-persistence-context name="bookingDatabase" auto-create="true" persistence-unit-jndi-name="java:/EntityManagerFactories/bookingData"/>
<persistence:managed-persistence-context name="bookingDatabase"
auto-create="true"
persistence-unit-jndi-name="java:/EntityManagerFactories/bookingData"/>
この設定により対話スコープの
bookingDatabase という名前の Seam コンポーネントが作成され、 JNDI 名 java:/EntityManagerFactories/bookingData を持つ永続ユニット (EntityManagerFactory インスタンス) の EntityManager インスタンスの寿命を管理します。
EntityManagerFactory を JNDI にバインドする必要があります。これを行うには JBoss では、 次のプロパティ設定を persistence.xml に追加します。
<property name="jboss.entity.manager.factory.jndi.name"
value="java:/EntityManagerFactories/bookingData"/>
<property name="jboss.entity.manager.factory.jndi.name"
value="java:/EntityManagerFactories/bookingData"/>
これで以下のように
EntityManager をインジェクトできます。
@In EntityManager bookingDatabase;
@In EntityManager bookingDatabase;
EJB 3 を使用していてクラスまたはメソッドに
@TransactionAttribute(REQUIRES_NEW) をマークすると、トランザクションと永続コンテキストはこのオブジェクトでのメソッド呼び出しには伝播されないはずです。 ただし、 Seam 管理永続コンテキストは対話内のいずれのコンポーネントにも伝播されるため REQUIRES_NEW とマークされたメソッドに伝播されます。 したがって、 メソッドに REQUIRES_NEW をマークする場合は @PersistenceContext を使ってエンティティマネージャにアクセスしてください。