4

Spring MVC 3.1.1 JPA、Hibernate 4.1.4 を jpa プロバイダー MYSQL 5.5.x TOMCAT 7 で実行する Maven テスト プロジェクトを構築しています。

DBからの読み取りと更新を含む単純なエンドエンドの基本的なユースケースを作成しようとしています。私は純粋な JPA に固執するのが好きなので、@PersistenceContext アノテーションを使用して自分の dao に注入された、Spring の LocalContainerEntityManagerFactoryBean を使用しています。

この時点で私が抱えていた問題:

  1. DB に永続化できませんでした (例外はスローされませんが、DB リフレクションもありません)。
  2. フォーム DB を削除できませんでした (例外はスローされませんが、DB リフレクションもありません)。

DBから読み取ることはできましたが。

ドキュメントを調べたところ、TOMCAT には標準でこれが含まれていないため、一部の JPA サポートが欠落している可能性があることがわかりました。

私はこれこれあれ(そしてさらにいくつか..)を経験し、以下を適用しました:

  • spring-instrument-tomcat 依存関係を pom.xml に追加しました (jar を取得するためだけに)。
  • そのjarをTomcatのlibディレクトリにコピーしました
  • META-INF ディレクトリの下に、次の内容の context.xml ファイルを作成しました。

    <Context docBase="SpringTest" path="/SpringTest" reloadable="true"
        source="org.eclipse.jst.jee.server:SpringTest">
        <Loader
            loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"
            useSystemClassLoaderAsParent="false" />
    </Context>
    
  • エンティティ マネージャーの定義に InstrumentationLoadTimeWeaver を追加しました

そして、それはトリックを行うはずでしたが、そうではありませんでした. 私は同じ行動を経験しました。

次に、stackoverflowからこの質問に遭遇しました。トランザクション定義<tx:annotation-driven proxy-target-class="true" />を DispatcherServlet コンテキストに追加することを提案した回答の 1 つ (これまでのところ、ルート アプリケーション コンテキストにしかありませんでした)。それがうまくいき始めた後、トランザクションはDBにコミットされました。

この時点で、残りのすべてのものがまだ必要かどうか疑問に思い始めたので、DispatcherServlet への追加以外に行ったすべてをロールバックしましたが、それでも完全に機能します!

SO、私の質問: どのように機能しますか? tomcat で JPA をサポートするには、これらすべてが本当に必要ですか? 最後に、これを解決するために宣言を DispatcherServlet にコピーする必要があるのはなぜですか?

前もってありがとう、ヨギ

4

1 に答える 1

0

データベースをCRUDするために、「私のpom.xmlへのspring-instrument-tomcat依存関係」は必要ありません。例外なしでデータベースを読み取ることはできるが、書き込みや更新を行うことはできないという事実は、スプリング トランザクションが欠落している正常な構成を示しています (@Transactional に適切なアノテーションを付け、アノテーション駆動型のスプリング コンテキストを適切に宣言します)。不要な jar を Tomcat にロードしないでください。Spring ソース ツールスイートで新しい Spring テンプレート プロジェクト (Simple spring jpa ユーティリティ プロジェクト) を開始し、spring-hibernate-jpa プロジェクトに本当に必要な依存関係を確認します。

于 2012-10-12T11:36:40.490 に答える