問題タブ [embedded-container]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 組み込みの TomEE 8.0 で OpenJPA を使用してエンティティ マネージャーを使用すると、不可解な「org.apache.openjpa.persistence.PersistenceException: null」例外が発生する
Apache TomEE Maven プラグインを使用して開発された Java Enterprise Web アプリケーションのテストを作成しようとしていました。アプリケーションは問題なく動作し、すべてが正しく機能しているようです。JUnit Jupiter 5 と、TomEE 8.0.0 が組み込まれた EJBContainer API を使用することを考えました (TomEE Maven プラグインにも同じバージョンを使用しています)。ただし、組み込みコンテナーをブートストラップした後、エンティティ マネージャーを使用するメソッドが呼び出されるとすぐに、非常に紛らわしい例外が起動されます。以下は、スローされる直前に埋め込みコンテナによってログに記録されたいくつかの情報とともに、例外に続きます。
埋め込みコンテナーが次の行をログに記録することは注目に値します。これは、TomEE Maven プラグインを使用してアプリケーションを通常どおり起動した場合には表示されません。
前のブロックには含まれていない次の行についても同様です。
URL http://tomee.apache.org/javaagent.htmlで提供されている指示に従ってみましたが、これで問題が解決する可能性が最も高いですが、それらは時代遅れのようで、最終的には機能しません。
次に、テスト用の永続化プロバイダーをデフォルトの OpenJPA 3.1.0 から EclipseLink 2.7.5 (現在の最新バージョン) に切り替えました。Criteria API は、アプリケーションでクエリを記述するために使用されます。それらのいくつかは、GROUP BY とともに JOIN 句を使用します。いくつかの厄介なバグのために、EclipseLink は、JPQL と同等のクエリを作成するときに GROUP BY を単純に無視します。これらのクエリをプレーンな JPQL で記述して一時的に修正しようとしましたが、そのうちのいくつかは ORDER BY 句で COALESCE 関数を使用しています。これは OpenJPA でサポートされていないため、実行時にアプリケーションでエラーがスローされます。非テスト環境で。しかし、それは本題とはあまり関係がないので、先に進みましょう。
ここに私のテストクラスがあります:
test.persistence.xml
およびtest.resources.xml
ファイルは次のとおりです。
persistence.xml
とファイルはresources.xml
ほぼ同じで、唯一の違いはデータソースと永続化ユニットの名前と JDBC URL です (テスト データベースはメモリ内にあり、メイン データベースはファイル ベースですが、TomEE Maven プラグインを使用しているためです)。実用上の違いはほとんどありません)。
PersistenceContext
アノテーションを使用してアプリケーション全体にエンティティ マネージャーをunitName
挿入する場合、テストが実行されているかどうかに応じて正しい永続化ユニットが使用されるように要素を指定していないことに注意してください。persistence.xml
と の両方がそれぞれ 1 つの永続性ユニットのみを定義するため、あいまいさは発生しませんtest.persistence.xml
。そのため、コンテナーによって適切な永続性ユニットが自動的に選択されます (テストを実行するとき、メインのリソース ファイルは無視され、テスト用のファイルが優先されます)。
前に述べたように、エンティティ マネージャ メソッドが呼び出されるとすぐに (でもentityManager.getProperties()
) 例外がスローされます。テストでは、userAgent.createUser(user)
次のようにメソッドが呼び出されます。