多个罐子,单个持久性单元解决方案?

时间:2013-02-22 14:23:27

标签: java jpa persistence-unit

包括我在内的一些人一直在努力将来自不同模块(jar)的实体合并到一个持久性单元中(尤其是 JavaSE ,例如这里JPA 2.0: Adding entity classes to PersistenceUnit *from different jar* automatically)。根据答案,没有简单的直接方法来做到这一点。解决方案之一是在单个持久性单元文件中列出所有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 /订单mappings.xml

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

即使映射文件没有映射任何属性,但是无论如何都要考虑Java类中的注释,一切似乎都运行得很好!这意味着只需通过包含来自特定JAR的XML映射文件,就可以轻松地将来自多个jar的实体包含到单个持久性单元中。

我的问题是:这是一个允许的JPA映射文件用法还是只是我的持久性提供程序(Hibernate)的副作用?

1 个答案:

答案 0 :(得分:6)

是的,这是JPA规范允许的。

XML实体映射旨在覆盖JPA注释。 除非您使用<xml-mapping-metadata-complete/>标记专门更改默认行为,否则JPA提供程序将使用没有XML映射的注释。

以下摘自JPA 2.0 spec

  

12.1使用XML描述符

     

......缺席或   包含在中的xml-mapping-metadata-complete子元素的提示   实体映射的persistence-unit-defaults子元素   element控制是否为XML对象/关系映射描述符   用于有选择地覆盖注释值或它是否起作用   作为Java语言元数据注释的完全替代。

     

如果   指定了xml-mapping-metadata-complete子元素   包含持久性单元的完整映射元数据集   在持久性单元的XML映射文件中,以及任何持久性   类的注释被忽略。