26.6. Spring での Seam 管理永続コンテキストの使用
Seam の最もパワフルな機能として、その対話スコープや対話が生きている間
EntityManager をオープンにしておくという機能があります。 これによりエンティティの分離や再併合に関連する多くの問題が解消され、LazyInitializationException の発生を軽減できます。 Spring は単一の Web 要求 (OpenEntityManagerInViewFilter) のスコープを越えて永続コンテキストを管理する方法は提供していません。
Spring 開発者が Spring 提供の JPA ツールで Seam 管理永続コンテキストにアクセスできるようにすることで、Seam は対話スコープの永続コンテキストの機能を Spring アプリケーションにもたらしました (
PersistenceAnnotationBeanPostProcessor、 JpaTemplate など)。
この統合により次のような機能を実現します。
- Spring 提供のツールを使った Seam 管理永続コンテキストへの透過的なアクセス
- Web 要求以外での Seam 対話スコープ永続コンテキストへのアクセス (非同期の Quartz ジョブなど)
- Spring 管理トランザクションで Seam 管理永続コンテキストを使用する機能 (手作業による永続コンテキストのフラッシュが必要)
Spring の永続コンテキスト伝播モデルは
EntityManagerFactory ごとに 1 つのオープン EntityManager しか可能でないため、 Seam 統合は EntityManagerFactory を Seam 管理永続コンテキストでラップすることで動作します。
<bean id="seamEntityManagerFactory"
class="org.jboss.seam.ioc.spring.SeamManagedEntityManagerFactoryBean">
<property name="persistenceContextName" value="entityManager"/>
</bean>
<bean id="seamEntityManagerFactory"
class="org.jboss.seam.ioc.spring.SeamManagedEntityManagerFactoryBean">
<property name="persistenceContextName" value="entityManager"/>
</bean>
persistenceContextName は Seam 管理永続コンテキストコンポーネントの名前です。 デフォルトではこの EntityManagerFactory には Seam コンポーネント名と同等の unitName があります。この場合は entityManager です。 別の unitName を与えたい場合は次のようにして persistenceUnitName を与えることができます。
これでこの
EntityManagerFactory をいずれの Spring 提供のツールでも使用することができます。この場合は、Spring の PersistenceAnnotationBeanPostProcessor を Spring で使用するのと同じように使用することができます。
<bean class="org.springframework.orm.jpa.support
.PersistenceAnnotationBeanPostProcessor"/>
<bean class="org.springframework.orm.jpa.support
.PersistenceAnnotationBeanPostProcessor"/>
実際の
EntityManagerFactory を Spring で定義するが Seam 管理永続コンテキストを使用したい場合は、 defaultPersistenceUnitName プロパティを指定してデフォルトで使用したい persistenctUnitName を PersistenceAnnotationBeanPostProcessor に指示することができます。
applicationContext.xml は次に似たようなものになります。
component.xml は次に似たようなものになります。
<persistence:managed-persistence-context name="entityManager"
auto-create="true" entity-manager-factory="#{entityManagerFactory}"/>
<persistence:managed-persistence-context name="entityManager"
auto-create="true" entity-manager-factory="#{entityManagerFactory}"/>
JpaTemplate および JpaDaoSupport は Spring ベースの永続コンテキストと通常の Seam 管理永続コンテキストではまったく同じ構成になります。
<bean id="bookingService"
class="org.jboss.seam.example.spring.BookingService">
<property name="entityManagerFactory" ref="seamEntityManagerFactory"/>
</bean>
<bean id="bookingService"
class="org.jboss.seam.example.spring.BookingService">
<property name="entityManagerFactory" ref="seamEntityManagerFactory"/>
</bean>