私はEJB3/JPA Webサービスを大きな問題なく実装しましたが、今度はSpring-WS /JPAWebサービスに移行しました。どちらもGlassfishにデプロイされています。
私のJPAの理解は限られていますが、デフォルトではトランザクションはコンテナー管理されていますか?これをどのように変更しますか?EJB3ではEntityManager
、「DAO」(別の機会に議論します!)にインジェクトするだけ@PersistentContext
で、コンテナーがトランザクションの境界を処理するため、作業は簡単でした。それについての基本的な構成に関して。コンテナはJTAを使用するため、永続性ユニットでトランザクションタイプ「JTA」を指定しました。1つの永続性ユニットを使用する非常に単純なサンプルアプリケーションでは、その名前を気にする必要はありません-複数の永続性ユニットがある場合、状況はさらに複雑になりますか、それともコンテナがこれを処理しますか?
これで、Spring-WSを使用して同等のWebサービスを構築し、エンティティ/ daoを再利用しましたが、それを機能させるのに苦労しました。アプリケーションコンテキストに、EntityManagerFactory
(LocalContainerEntityManagerFactoryBean
)とJpaTransationManager
(へのBean参照)のBean定義を含めましたEntityManagerFactory
。PersistenceAnnotationBeanPostProcessor
とtx
名前空間も含めました。他に何もする必要があるとは思いませんでしたが、「null」エラーで使用できる永続性プロバイダーがない場合はデプロイされません。
マネージャを作成する実際の永続性ユニットを指定する必要がありますか?
ありがとう、
アップデート:
次のエラーが発生します:javax.persistence.PersistenceException:nullという名前のEntityManagerの永続性プロバイダーがありません。
これはおそらく、ファクトリ/マネージャの私の春の構成です。
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManager" />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<tx:annotation-driven/>
私はそれに何か他のものを必要とするか注入するかもしれないと思います...
別の更新:
その問題を修正しました-のLocalEntityManager
代わりにを使用していましたLocalContainerEntityManager
。
現在、オブジェクトの永続化に問題があります。プロパティとして子オブジェクトを持つ親オブジェクトがあります。を呼び出すと、子オブジェクトがログに永続化されていることがわかりますem.persist(parent)
が、親は永続化されません。
最後の更新:
親オブジェクトは永続化されていましたが、トランザクションを取得しようとする前にトランザクションがコミットされていませんでした(いわばモックせずにモックしています)。私は今それの要点を持っていると思います。