21

私を含む一部の人々は、異なるモジュール(jar)からのエンティティを単一の永続化ユニットにマージするのに苦労しています(特にJavaSE、たとえばここではJPA 2.0:エンティティクラスをPersistenceUnitに*異なるjarから*自動的に追加します)。答えに基づいて、それを行う簡単な直接的な方法はありません。解決策の1つは、すべてのjarのすべてのクラスを単一の永続性ユニットファイルにリストすることですが、それはあまり洗練されていません。誤って別の方法を見つけた可能性があります。通常、すべてのエンティティクラスはアノテーションを使用してマップされます。解決策として:persistence.xml複数のXMLマッピングファイルを含めることができます。例:

main.jar!META-INF / persistence.xml:

<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
  <mapping-file>META-INF/order-mappings.xml</mapping-file>
  <mapping-file>META-INF/customer-mappings.xml</mapping-file>
</persistence-unit>

マッピングファイルは、さまざまなjarファイルに配置できます。私が気付いたのは、属性のない<entity>要素が含まれている可能性があることです。例:

order.jar!META-INF / order-mappings.xml

<entity-mappings>       
  <entity class="com.company.Order"></entity>    
</entity-mappings>

マッピングファイルが属性をマッピングしていなくても、Javaクラスのアノテーションが考慮され、すべてが正常に機能しているように見えます。つまり、特定のJARからのXMLマッピングファイルを含めるだけで、複数のjarからのエンティティを単一の永続性ユニットに簡単に含めることができます。

私の質問は、これは許可されたJPAマッピングファイルの使用ですか、それとも永続性プロバイダー(Hibernate)の単なる副作用ですか?

4

1 に答える 1

6

はい、これはJPA仕様で許可されています。

XMLエンティティマッピングは、JPAアノテーションをオーバーライドするように設計されています。タグを使用してデフォルトの動作を特に変更しない限り <xml-mapping-metadata-complete/>、JPAプロバイダーはXMLマッピングがない場合にアノテーションを使用します。

これがJPA2.0仕様からの抜粋です。

12.1XML記述子の使用

... entity-mappings要素のpersistence-unit-defaultsサブ要素に含まれるxml-mapping-metadata-completeサブ要素の有無は、XMLオブジェクト/リレーショナルマッピング記述子を使用して注釈値を選択的にオーバーライドするかどうかを制御します。これは、Java言語のメタデータ注釈の完全な代替手段として機能します。

xml-mapping-metadata-completeサブ要素が指定されている場合、永続性ユニットのマッピングメタデータの完全なセットが永続性ユニットのXMLマッピングファイルに含まれ、クラスの永続性アノテーションはすべて無視されます。

于 2013-05-07T12:33:09.117 に答える