2

私はEJB3/JPA Webサービスを大きな問題なく実装しましたが、今度はSpring-WS /JPAWebサービスに移行しました。どちらもGlassfishにデプロイされています。

私のJPAの理解は限られていますが、デフォルトではトランザクションはコンテナー管理されていますか?これをどのように変更しますか?EJB3ではEntityManager、「DAO」(別の機会に議論します!)にインジェクトするだけ@PersistentContextで、コンテナーがトランザクションの境界を処理するため、作業は簡単でした。それについての基本的な構成に関して。コンテナはJTAを使用するため、永続性ユニットでトランザクションタイプ「JTA」を指定しました。1つの永続性ユニットを使用する非常に単純なサンプルアプリケーションでは、その名前を気にする必要はありません-複数の永続性ユニットがある場合、状況はさらに複雑になりますか、それともコンテナがこれを処理しますか?

これで、Spring-WSを使用して同等のWebサービスを構築し、エンティティ/ daoを再利用しましたが、それを機能させるのに苦労しました。アプリケーションコンテキストに、EntityManagerFactoryLocalContainerEntityManagerFactoryBean)とJpaTransationManager(へのBean参照)のBean定義を含めましたEntityManagerFactoryPersistenceAnnotationBeanPostProcessortx名前空間も含めました。他に何もする必要があるとは思いませんでしたが、「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)が、親は永続化されません。

最後の更新:

親オブジェクトは永続化されていましたが、トランザクションを取得しようとする前にトランザクションがコミットされていませんでした(いわばモックせずにモックしています)。私は今それの要点を持っていると思います。

4

1 に答える 1

0

JPA についての私の理解は限られていますが、デフォルトではトランザクションはコンテナー管理されていますか?

Java EE 環境では、セッション Bean のデフォルトのエンティティ マネージャ タイプは、コンテナ管理およびトランザクション スコープです。

これをどのように変更しますか?

正確には何を変更しますか?そして、どのような文脈で?Java EE 環境では、Bean Managed Transaction (BMT) セッション Bean を使用して、UserTransaction.

複数の永続化ユニットがある場合、事態はさらに複雑になりますか?それともコンテナーがこれを処理しますか?

これについてはわかりません。コンテナ固有の可能性があります。したがって、複数の永続化ユニットがある場合、私のアドバイスはunitName.

これで、Spring-WS を使用して同等の Web サービスを構築しました (...) マネージャーを作成する実際の永続化ユニットを指定する必要がありますか?

これは必須ではありません。この記事は、デフォルトのメカニズムの素晴らしい要約を提供します (ドキュメントでも説明されているかもしれませんが、簡潔なものは見つかりませんでした):

Spring は、このファクトリ Bean で指定されたプロパティの値と同じ名前 LocalContainerEntityManagerFactoryBean の永続ユニット記述子 (例: ) から永続ユニット構成をロードします (リスト 1 および 2 を参照)。持続性ユニット名が指定されていない場合、持続性ユニット記述子の最初の構成が選択されます。アノテーションが付けられた Spring Bean のプロパティーへの永続化マネージャーの挿入は、Spring 構成ファイルに登録する必要がある特別な Bean ポストプロセッサーによって処理されます (リスト 9 を参照)。META-INF/persistence.xmlpersistenceUnitName@PersistenceContext

(...)

Spring が @PersistenceContextBean プロパティでアノテーションを検出すると、アノテーションのunitName属性 の値を使用して、フォールバックとして Bean ID と照合し、EntityManagerFactory一致するプロパティ値を持つ を生成するファクトリ Bean を見つけます。アノテーションで属性が指定されていない persistenceUnitName場合、 Spring は、Spring 構成で定義された最初の を生成するファクトリー Bean を使用します。を使用してトランザクション スコープのオブジェクトを Spring Bean に注入する例を リスト 10 に示します (アプリケーションに永続化ユニットが 1 つしかない場合は、この 属性を安全に省略できます)。 (...)unitNameEntityManagerFactory@PersistenceContextEntityManagerunitName

あなたの問題に戻りますが、私の提案は次のとおりです。

  • あなたpersistence.xmlとSpring構成の関連ビットで質問を更新してください
  • ロギング (特に のorg.springframework.orm) をアクティブにして、初期化時にすべてがうまくいくかどうかを確認します
  • を指定したときに何が得られるかを確認してくださいunitName
于 2010-10-09T05:20:08.103 に答える