どちらも TomEE コンテナーにある Spring Bean と EJB を取得して、共通の永続化コンテキストを使用するにはどうすればよいですか?
主にSpringアプリケーションにいくつかのEJBコンポーネントを取り込もうとしています。最終的にはすべてが EJB3 または Spring になりますが、近い将来、私はハイブリッドの世界に住んでいます。
- DataSource は、アプリケーションの resources.xml ファイルで定義されます
- PersistenceUnit は、データソースを参照する persistence.xml ファイルで定義されています
Spring は、applicationContext.xml ファイルで次のようにコンテナー トランザクション マネージャーと EntityManagerFactory にアクセスします。
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:comp/env/comp/TransactionManager"/> </bean> <jee:jndi-lookup id="entitiesEntityManagerFactory" jndi-name="persistence/entitiesPersistenceUnit" resource-ref="true"/>
Spring および EJB コンポーネントは、トランザクション マネージャー、エンティティ マネージャー、またはデータ ソースを問題なく見つけることができます。完全にSpringまたは完全にEJBであれば何でも問題なく動作します。しかし...
EJB でトランザクションを開始し、Spring Bean で呼び出されたメソッドに伝播する必要があるポイントがいくつかあります。この時点で、Spring Bean は、管理されていないエンティティを操作していると不平を言います。EJB の開始メソッドにアノテーションを付け、
@TransactionAttribute
Spring Bean の受信メソッドに@Transactional(propagation=Propagation.Mandatory)
;アノテーションを付けます。Spring Bean は、トランザクション コンテキストにないことについて不平を言いませんが、this.entityManager.contains(this)
false を返すことで検証されるように、何らかの形で永続化コンテキストが続きません。
問題は、Spring と OpenEJB がエンティティーマネージャーの注入を処理する方法にあるようです。EJB と Spring Bean に同じコードを含めると、次のようになります。
@PersistenceContext
EntityManger em;
EJB ではem
、のインスタンスが注入されます。org.apache.openejb.persistence.JtaEntityManager
一方、Spring では、em
次のように出力されるものが注入されます。
shared EntityManager proxy for target factory [org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory@1ca24fe7]
JtaEntityManager
と Proxy の両方に、基本となる同じインスタンスが含まれています。org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory
Spring と EJB の統合に関する情報はすべて読みましたが、共有永続化コンテキストや、EJB から Spring Bean にまたがるトランザクションを扱う具体的なものは見つかりませんでした。