JPA の関連オブジェクトの奇妙な動作について少し混乱しています。私は3つのバンドルを持っています:
ユーザー バンドルにはユーザー関連のオブジェクトがいくつか含まれていますが、主にUser
オブジェクトです。
エネルギー バンドルには、いくつかのエネルギー関連のオブジェクトが含まれています。特に、ConsumptionTerminal
ユーザーのリストが含まれています。
Index バンドルには、まったく依存関係のない Index オブジェクトが含まれています。
私のOSGi環境は次のとおりです。
2 つのサービスを提供する DataSource バンドル: dataSource と jpaVendorAdapter。
三束ね。彼らは と を消費
dataSource
しjpaVendorAdapter
ます。それらの
module-context.xml
ファイルは次のようになります。そして、それらはすべて
persistence.xml
ファイルを持っています:ユーザー
<?xml version="1.0" encoding="UTF-8"?> <persistence> <persistence-unit name="securityPU" transaction-type="JTA"> <jta-data-source>java:/securityDataSourceService</jta-data-source> <class>net.nextep.amundsen.security.domain.User</class> <!-- [...] --> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="eclipselink.logging.level" value="INFO" /> <property name="eclipselink.ddl-generation" value="create-tables" /> <property name="eclipselink.ddl-generation.output-mode" value="database" /> <property name="eclipselink.orm.throw.exceptions" value="true" /> </properties> </persistence-unit> </persistence>
エネルギー
<?xml version="1.0" encoding="UTF-8"?> <persistence> <persistence-unit name="energyPU" transaction-type="JTA"> <jta-data-source>java:/securityDataSourceService</jta-data-source> <class>net.nextep.amundsen.security.domain.User</class> <class>net.nextep.amundsen.energy.domain.User</class> <!-- [...] --> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="eclipselink.logging.level" value="INFO" /> <property name="eclipselink.ddl-generation" value="create-tables" /> <property name="eclipselink.ddl-generation.output-mode" value="database" /> <property name="eclipselink.orm.throw.exceptions" value="true" /> </properties> </persistence-unit> </persistence>
Index : これには、Index クラスのみ (共有クラスなし) を持つ最も単純な persistence.xml があります。
(ユーザーバンドル用)のような名前@PersistenceUnit
付き注釈を使用しています。@PersitenceUnit(name = 'securityPU')
最後に、EclipseLink を JPa プロバイダーとして使用し、Spring DM (+ 開発プロセスでは Spring DM Server) を使用しています。
問題は次のとおりです。
- ユーザー バンドルがデプロイされると、ユーザー オブジェクトを永続化できます。
- ユーザー バンドルとエネルギー バンドルの両方がデプロイされている場合、ユーザー オブジェクトを永続化できません (エネルギー オブジェクトも永続化できません)。しかし、私には例外はありません。
- Index バンドルにはまったく問題はありません。
バグは dataSource に依存しません (これまで PostgreSQL と MySQL で試しました)。
私の最初の結論は<class>net.nextep.amundsen.security.domain.User</class>
、両方の永続化ユニットが問題を引き起こしているということでした。私はそれなしで(そしてエネルギーバンドルにユーザー依存オブジェクトを隠して)試しましたが、それも失敗しました。
私はそのバグについて少し混乱しています。また、このコンテキストでのトランザクション管理についてもよくわかりません。
私はこのアーキテクチャを設計した人ではありませんでした(しかし、私はインターンにそれをテストせずに OK と言います.. 恥ずかしいです)、もし私がこのバグを理解し、バンドルを書き直さずに (そして私のインターンの仕事を壊すことなく) 修正できるなら、私は感謝します。私は何か間違っていますか?(それは明らかですが、何..) ドキュメントを読んでいるときに何かを見逃しましたか?
ちなみに、JPA、EclipseLink (または任意の JPA プロバイダー)、Spring DM (および一般的な OSGi) に関するベスト プラクティスやアドバイスも探しています。このトピックに関する Mike Keith の興味深いスライドを見つけました (Stackoverflow を参照)。