Spring、Hibernate、Mavenを使用して非常にモジュール化された方法でWebアプリケーションを開発しています。データアクセスとビュー固有のものを定義するコアプロジェクトがあり、ロジックとエンティティを定義するモジュール(@Entity
)があり、コントローラーとビューを定義するWebアプリがあります。
これで、アカウントやロールなどのセキュリティエンティティを定義するセキュリティモジュールがあり、顧客や注文などのエンティティの例を定義するプロトタイプモジュールがあります。どちらもpersistence.xml
内にPersistenceUnit
が定義されていますが、すべてのデータベース構成はdatasource.xmlを使用してWebアプリで行われるため、PersistenceUnit名を除いてほとんど空です。 Webアプリは、両方のjarをMavenの依存関係としてロードすることになっています。
どちらのプロジェクトも、すべてのエンティティを自動スキャンして、それぞれの単体テスト用に作成し、正常に構築します。個別に追加すると、Webアプリ内にも正常に読み込まれます。
ただし、両方が同時にロードされるとすぐに、2番目のエンティティは最初のエンティティのPersistenceUnit
をオーバーライドし、最初のエンティティのすべてのエンティティに対してIllegalArgumentException : Not an entity
を作成します。両方のプロジェクトの永続性ユニットが異なる場合、Webアプリをロードすると、no single default persistence unit
が定義されているという別の例外がスローされます。
だから..どうすればすべての@Entity
アノテーション付きクラスをpersistence.xml
内で( ここ のように)定義せずに、コンポーネントを介してWebアプリにロードすることができますか?スキャン? This アイデアのようですが、使い方やテストの仕方がわかりません...
Webアプリ内のすべてのPersistenceUnitをマージするか、プログラムですべてのエンティティをロードする必要があると思います。それらをpersistence.xml内にハードコードして定義することは、私たちの選択肢ではありません。
同様のモジュールレイアウトを使用しますが、永続コンテキストをアプリケーションのwar部分に配置し、entitymanagerをモジュールのDAOに挿入します。ユニットテストを除いて、モジュールにはPUがありません。複数のモジュールにまたがるトランザクションが問題を引き起こす可能性があることを恐れていたため、これを行いました。
DAOで
@PersistenceContext
private EntityManager em;
Persistance.xmlで、すべてのエンティティを要素に参加させる必要があります。
<persistence-unit name="myPU">
<class>com.Entity1</class>
<class>com.Entity2</class>
等.
質問はまだ注目を集めているようですので、問題の最新の解決策を投稿します。
現在、persistence.xmlを使用する代わりにすべてのパッケージを自動スキャンしていますファイルをどこにでも配置できます。
Datasource.xmlに次の行を追加しました
<property name="packagesToScan" value="our.basepackage" />
ほぼ完全なdatasource.xml:
<!-- Bean definition here -->
<bean id="ourDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!-- define connection properties -->
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="ourDataSource" />
<property name="packagesToScan" value="our.basepackage" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
</bean>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />
そうですね、開発サイクルでも同様の問題が発生しています。参照エンティティが別の-ejb.jarファイルにある場合(これが私たちの場合)、これらのエンティティを次のようにバインドできます。
<jar-file>relativePathToYourJar/dependent-entities-ejb.jar</jar-file>
鬼ごっこ。 dependent-entities-ejb.jar
のMETA-INFフォルダーの下にもpersistence.xmlを含める必要があることに注意してください。詳細については、 ここ を参照してください。
クラスはクラスローダーにあります。
これで答えます スキャンJava実行時の注釈 。
それはあなたが望むものですか?注釈付きの@Entity
をスキャンし、それらをPersistenceUnit
に追加するには?
よろしく。
Tugcemのようなソリューションを作成しましたが、Mavenを使用しているため、persistence.xmlにjarバージョン番号を含めるのは嫌です。私が思いついた解決策はここで説明されています: JPA 2.0:エンティティクラスをPersistenceUnitに*異なるjarから*自動的に追加する