問題タブ [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.

0 投票する
1 に答える
775 参照

maven - openJPAでビルド時に別のjarからクラスを拡張する方法は?

Mavenプラグインを使用して別のJarからのEntityクラスを強化しようとしてopenjpa-maven-pluginいますが、残念ながら正しい方法が見つかりませんでした。

jar にパッケージ化されたMyPojoモジュールのクラスが 1 つあります。MyDomainmy-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 を使用して拡張されませんでした。

クラスMyPojoMyJpa(プロジェクト MyDomain ではなく) プロジェクトに移動すると、機能します。

MyPojo私の質問は次のとおりです。ビルド時に外部 Jar からのクラスを拡張できるようにするには、何を構成する必要がありますか?

0 投票する
1 に答える
294 参照

maven - [EXCEPTION]:タスク実行例外, 原因: java.lang.NoClassDefFoundError: org/apache/openjpa/conf/OpenJPAConfiguration

Cassandra に関連する pom.xml に新しい依存関係を含めた後、この例外を受け取り始めました。アプリケーションでログを記録するために使用しています。

ここに私の pom.xml があります:

ログ プロジェクトの pom.xml は次のとおりです。

OpenJPAConfiguration を持つ pom.xml に openjpa-all 依存関係を含めた後でも、この問題が引き続き発生します。これに関する助けをいただければ幸いです。

0 投票する
0 に答える
614 参照

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 回目の呼び出しでは、cachedCriteriaQueryisSELECT s FROM Subtask s WHERE (s.deviceId IN ('1000000002') AND s.state IN (5,10)) ORDER BY s.idvaluesis [[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です。deviceIdstate100000000251010000000035

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-jpajdbc driverおよびライブラリのバージョンはopenjpa次のとおりで、jdk は1.8、データベースはPostgreSQL 9.4 windows versionです。

エンティティ クラスは、ビルド時に次のように拡張されます。openjpa-maven-plugin

EntityManagerFactoryBean設定 とは次のpersistence.xmlとおりです。

QueryCacheQuerySQLCacheの両方をfalseに設定しても、正しく動作しません。

ただし、openjpaライブラリをバージョン2.2.2にダウングレードすると、すべて同じコードと構成で正確に機能します。また、@Query以下のように subtaskDao インターフェースに を使用すると、 と一緒でもうまく動作しopenjpa version 2.4.1ます。

私が発見していないトリッキーは何ですか?

0 投票する
1 に答える
991 参照

maven - Spring Boot で OpenJPA エンティティの静的拡張を実行できない

mvn packageopenjpa-maven-plugin:enhanceSpring Boot アプリで JPA エンティティを拡張しようとした段階で失敗します。

エラーの説明が長い

enhance failed: MetaDataFactory could not be configured (conf.newMetaDataFactoryInstance() returned null).

no configuration properties were found.

いくつかの理由がリストされています。

  1. META-INF/persistence.xml ファイルがあり、クラスパスで使用できることを確認してください

    • 私はspring-data-jpaJava構成で使用していますが、
      persistence.xml. それなしで行うことは可能 ですか?openjpa:enhance
  2. 構成に使用しているプロパティー・ファイルが使用可能であることを確認してください。Ant を使用している場合は、タスクのネストされた要素の または 属性を参照してください。

    • Spring のサブクラスですべての OpenJPA プロパティを指定しorg.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfigurationます。以下のクラスを参照してください。これはおそらく私が変更する必要があるものですが、どうすればよいですか?そして、プロパティファイルをどこで指定してopenjpa-maven-plugin見つけることができますか?
  3. これは、OpenJPA ディストリビューション jar が破損している場合、またはセキュリティ ポリシーが厳しすぎる場合にも発生する可能性があります。

    • 除外 - OpenJPA jar を再ダウンロードしたことを確認したchecksumPolicy=failので、破損していないことが証明されました。また、このレベルではセキュリティ ポリシーを使用していません。

pom.xml

openjpa-maven-plugin エラー

のサブクラスJpaBaseConfiguration

0 投票する
1 に答える
1453 参照

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 pluginmvn clean install

ビルド出力:

等々...

しかし、ここでの問題は次のとおりです。テストは maven ビルド中にのみパスします。テスト クラスの個々のテスト、またはそのテスト クラスのすべてのテストを実行しようとすると、失敗します。また、このアプローチでは、永続化コンテキストで拡張されていないクラスのランタイム サポートを無効にしました。

そのため、期待どおりに機能していると結論付けましたopenjpa-maven-plugin

質問 1: これは予期された動作ですか? テストは Maven ビルドの外では機能しませんか? 質問 2: openjpa プラグインjavaagentは舞台裏を提供していますか?

javaagent何をすべきかわからないので、別の (???) アプローチに切り替え まし。これでは成功しませんでした。以下のエラーで終了しました:

質問 3:では、ビルド時の拡張機能を設定し、実行するすべての単体テストで拡張機能が機能することを確認するにはどうすればよいですか?

質問 4: Arquillian 内で実行されているテストに対してのみビルド時間の拡張を行うにはどうすればよいでしょうか (ポップ可能な場合)。

それとも、そもそもこれにアプローチするのは間違っていますか?