問題タブ [openjpa-maven-plugin]
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.
maven - openJPAでビルド時に別のjarからクラスを拡張する方法は?
Mavenプラグインを使用して別のJarからのEntityクラスを強化しようとしてopenjpa-maven-plugin
いますが、残念ながら正しい方法が見つかりませんでした。
jar にパッケージ化されたMyPojo
モジュールのクラスが 1 つあります。MyDomain
my-domain.jar
私の 2 番目のプロジェクトMyJpa
パッケージングmy-jpa.jar
では、それは module に依存しmy-domain.jar
、Maven は Build Time OpenJPA Enhancer を次のように使用するように構成されています。
orm.xml
で宣言された XML マッピングを使用していますpersistence.xml
。
そして、次のような orm.xml を使用します。
実行mvn install
すると、次のエラーが発生します。
この構成では実行時の最適化は許可されませんが、次の一覧にある型は、ビルド時またはクラスのロード時に javaagent を使用して拡張されませんでした。
クラスMyPojo
をMyJpa
(プロジェクト MyDomain ではなく) プロジェクトに移動すると、機能します。
MyPojo
私の質問は次のとおりです。ビルド時に外部 Jar からのクラスを拡張できるようにするには、何を構成する必要がありますか?
maven - [EXCEPTION]:タスク実行例外, 原因: java.lang.NoClassDefFoundError: org/apache/openjpa/conf/OpenJPAConfiguration
Cassandra に関連する pom.xml に新しい依存関係を含めた後、この例外を受け取り始めました。アプリケーションでログを記録するために使用しています。
ここに私の pom.xml があります:
ログ プロジェクトの pom.xml は次のとおりです。
OpenJPAConfiguration を持つ pom.xml に openjpa-all 依存関係を含めた後でも、この問題が引き続き発生します。これに関する助けをいただければ幸いです。
postgresql - openjpa 2.4.1 で cachedCriteriaQuery が正しくないため、接尾辞 IN を持つ spring-data-jpa クエリ メソッドによるクエリに失敗しました
アップデート:
spring-data-jpa リポジトリ クエリ メソッドのソース コードを掘り下げたところ、根本的な原因は以下のPartTreeJpaQuerycreateQuery
のメソッドであることがわかりました。
このメソッドは、spring-data-jpa リポジトリ クエリ メソッド インターフェースを呼び出すときに、RepositoryFactorySupportのQueryExecutorMethodInterceptorのinvokeメソッドによって呼び出されます。
最初の呼び出しでは、cachedCriteriaQuery
変数は期待どおりでSELECT s FROM Subtask s WHERE (s.deviceId IN (:deviceIdList) AND s.state IN (:states)) ORDER BY s.id
あり、values
変数は[[1000000002], [5, 10]]
どちらも正しいです。
ただし、2 回目の呼び出しでは、cachedCriteriaQuery
isSELECT s FROM Subtask s WHERE (s.deviceId IN ('1000000002') AND s.state IN (5,10)) ORDER BY s.id
とvalues
is [[1000000003], [5]]
. openjpa および jpa クエリに渡される値は正しいように見えますが、criteriaQuery
そうではありません。
openjpa
ライブラリをバージョン2.2.2に変更した場合、このメソッドを呼び出すたびに、cachedCriteriaQuery
変数はALWAYS SELECT s FROM Subtask s WHERE (s.deviceId IN (:deviceIdList) AND s.state IN (:states)) ORDER BY s.id
になります。
cachedCriteriaQuery
変数が変更される理由これは、PartTreeJpaQuery の QueryPreparer のプライベートかつ最終的なフィールドであり、それを割り当てることができる唯一の方法は、QueryPreparer のコンストラクターでなければなりません。そこでブレークポイントを切り替えましたが、1 回目と 2 回目の呼び出しの間に、このコンストラクターを呼び出したプロセスが見られませんでした。この変数はどのように変更されるのでしょうか?
私が行ったのは、openjpa ライブラリを変更しただけです。
ただし、上記のコードは spring-data-jpa および/または spring-data-commons です。これは、クエリ作成の動作にどのような影響を与える可能性がありますか?
フィールドとフィールドでサブタスク エンティティをクエリfind IN
するには、単体テスト コードを次のように指定します。最初のクエリは find IN deviceId and、state andです。2 回目のクエリは find IN deviceIdと stateです。deviceId
state
1000000002
5
10
1000000003
5
subtaskDao は以下のようなspring-data-jpa repository query method
インターフェースです
ただし、結果は以下のとおりであり、期待どおりには正しくありません。2 回目のクエリの結果は、 deviceId1000000002
ではなくdeviceId のサブタスクになり1000000003
ます。
openjpa.Log によると、初回はクエリ(7272行目) Query "SELECT s FROM Subtask s WHERE (s.deviceId IN (:deviceIdList) AND s.state IN (:states)) ORDER BY s.id"
。しかし、2回目はクエリを実行しますQuery "SELECT s FROM Subtask s WHERE (s.deviceId IN ('1000000002') AND s.state IN (5,10)) ORDER BY s.id"
。パラメータがとでないのはなぜですか?:deviceIdList
:states
spring
使用した、spring-data-jpa
、jdbc driver
およびライブラリのバージョンはopenjpa
次のとおりで、jdk は1.8
、データベースはPostgreSQL 9.4 windows version
です。
エンティティ クラスは、ビルド時に次のように拡張されます。openjpa-maven-plugin
EntityManagerFactoryBean
設定 とは次のpersistence.xml
とおりです。
QueryCacheとQuerySQLCacheの両方をfalseに設定しても、正しく動作しません。
ただし、openjpa
ライブラリをバージョン2.2.2
にダウングレードすると、すべて同じコードと構成で正確に機能します。また、@Query
以下のように subtaskDao インターフェースに を使用すると、 と一緒でもうまく動作しopenjpa version 2.4.1
ます。
私が発見していないトリッキーは何ですか?
maven - Spring Boot で OpenJPA エンティティの静的拡張を実行できない
mvn package
openjpa-maven-plugin:enhance
Spring Boot アプリで JPA エンティティを拡張しようとした段階で失敗します。
エラーの説明が長い
enhance failed: MetaDataFactory could not be configured (conf.newMetaDataFactoryInstance() returned null).
no configuration properties were found.
いくつかの理由がリストされています。
META-INF/persistence.xml ファイルがあり、クラスパスで使用できることを確認してください
- 私は
spring-data-jpa
Java構成で使用していますが、
persistence.xml
. それなしで行うことは可能 ですか?openjpa:enhance
- 私は
構成に使用しているプロパティー・ファイルが使用可能であることを確認してください。Ant を使用している場合は、タスクのネストされた要素の または 属性を参照してください。
- Spring のサブクラスですべての OpenJPA プロパティを指定し
org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration
ます。以下のクラスを参照してください。これはおそらく私が変更する必要があるものですが、どうすればよいですか?そして、プロパティファイルをどこで指定してopenjpa-maven-plugin
見つけることができますか?
- Spring のサブクラスですべての OpenJPA プロパティを指定し
これは、OpenJPA ディストリビューション jar が破損している場合、またはセキュリティ ポリシーが厳しすぎる場合にも発生する可能性があります。
- 除外 - OpenJPA jar を再ダウンロードしたことを確認した
checksumPolicy=fail
ので、破損していないことが証明されました。また、このレベルではセキュリティ ポリシーを使用していません。
- 除外 - OpenJPA jar を再ダウンロードしたことを確認した
pom.xml
openjpa-maven-plugin エラー
のサブクラスJpaBaseConfiguration
java - Arquillian テストの実行中に JPA エンティティのビルド時間拡張を実行するにはどうすればよいですか?
技術スタック: Arquillian embedded-tomee, HSQLDB, openJpa, jdk 1.8.
私はこれをすべて一緒に機能させる方法を見つけようと数日を費やし、IMO に非常に近づいてきました。そして今、私はこの非常に一般的なエラーに悩まされています。
すべてのエンティティが に追加され、 のtest-persistence.xml
下に正しく配置されてsrc/test/resources
います。
Runtime Unenhanced Classes
設定を
試みた最初の問題は、コンテナーsupported
内で実行時に拡張が行われることを期待していました。Arquillian-Embedded-Tomee
そこには運がありませんでした。一部のエンティティに、ランタイム拡張に必要な public/protected no-args コンストラクターがないというエラーが発生し続けました。
注: ランタイム拡張は、実際にデプロイされた tomee コンテナー内で完全に正常に機能します。Arquillian 内では機能しません。
上記の問題を解決するための最初のアプローチ:
エンティティをパブリックとして公開したくありませんでした。そのため、ここで説明されているように をbuild-time-enhancement
使用するように切り替えました。このアプローチである程度の成功を収めました。実行中にエンティティが強化されていることを実際に確認して確認できました。openjpa maven plugin
mvn clean install
ビルド出力:
等々...
しかし、ここでの問題は次のとおりです。テストは maven ビルド中にのみパスします。テスト クラスの個々のテスト、またはそのテスト クラスのすべてのテストを実行しようとすると、失敗します。また、このアプローチでは、永続化コンテキストで拡張されていないクラスのランタイム サポートを無効にしました。
そのため、期待どおりに機能していると結論付けましたopenjpa-maven-plugin
。
質問 1: これは予期された動作ですか? テストは Maven ビルドの外では機能しませんか? 質問 2: openjpa プラグインjavaagent
は舞台裏を提供していますか?
javaagent
何をすべきかわからないので、別の (???) アプローチに切り替え
ました。これでは成功しませんでした。以下のエラーで終了しました:
質問 3:では、ビルド時の拡張機能を設定し、実行するすべての単体テストで拡張機能が機能することを確認するにはどうすればよいですか?
質問 4: Arquillian 内で実行されているテストに対してのみビルド時間の拡張を行うにはどうすればよいでしょうか (ポップ可能な場合)。
それとも、そもそもこれにアプローチするのは間違っていますか?