包括我在内的一些人一直在努力将来自不同模块(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)的副作用?
答案 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映射文件中,以及任何持久性 类的注释被忽略。