Spring MVC 3.1.1 JPA、Hibernate 4.1.4 を jpa プロバイダー MYSQL 5.5.x TOMCAT 7 で実行する Maven テスト プロジェクトを構築しています。
DBからの読み取りと更新を含む単純なエンドエンドの基本的なユースケースを作成しようとしています。私は純粋な JPA に固執するのが好きなので、@PersistenceContext アノテーションを使用して自分の dao に注入された、Spring の LocalContainerEntityManagerFactoryBean を使用しています。
この時点で私が抱えていた問題:
- DB に永続化できませんでした (例外はスローされませんが、DB リフレクションもありません)。
- フォーム 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 にコピーする必要があるのはなぜですか?
前もってありがとう、ヨギ