包括我在内的一些人一直在努力将来自不同模块(jar)的实体合并到单个持久性单元中(尤其是 JavaSE ,例如此处的JPA 2.0:从不同的jar自动将实体类添加到PersistenceUnit中)。根据答案,没有简单直接的方法可以做到这一点。解决方案之一是在单个持久性单元文件中列出所有jar中的所有类,但这并不是很优雅。我可能不小心找到了另一种方法。通常,我所有的实体类都是使用 注释* 映射的。至于解决方案:persistence.xml可以包含多个XML映射文件,例如:
persistence.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>元素,例如: *
<entity>
order.jar!META-INF / order-mappings.xml
<entity-mappings> <entity class="com.company.Order"></entity> </entity-mappings>
即使映射文件没有映射任何属性 ,Java类中的注释仍然被考虑在内 ,一切似乎都正常!这意味着仅通过包含来自特定JAR的XML映射文件,就可以轻松地将多个jar中的实体包含到单个持久性单元中。
我的问题是:这是允许的JPA映射文件使用,还是仅仅是我的持久性提供程序(休眠)的副作用?
是的,这是JPA规范所允许的。
XML实体映射旨在覆盖JPA注释。除非您使用<xml-mapping-metadata- complete/>标签专门更改默认行为,否则JPA提供程序将在没有XML映射的地方使用注释。
<xml-mapping-metadata- complete/>
这是JPA 2.0规范的摘录:
12.1 XML描述符的使用 …实体映射元素的persistence-unit-defaults子元素中包含的xml-mapping-metadata- complete子元素的不存在或存在控制着XML对象/关系映射描述符是否用于选择性地覆盖注释值,或者是否它可以完全替代Java语言元数据注释。 如果指定了xml-mapping-metadata- complete子元素,则该持久性单元的完整映射元数据集将包含在该持久性单元的XML映射文件中,并且将忽略类上的所有持久性注释。
12.1 XML描述符的使用
…实体映射元素的persistence-unit-defaults子元素中包含的xml-mapping-metadata- complete子元素的不存在或存在控制着XML对象/关系映射描述符是否用于选择性地覆盖注释值,或者是否它可以完全替代Java语言元数据注释。
如果指定了xml-mapping-metadata- complete子元素,则该持久性单元的完整映射元数据集将包含在该持久性单元的XML映射文件中,并且将忽略类上的所有持久性注释。