21

包括我在内的一些人一直在努力将来自不同模块(jar)的实体合并到一个持久性单元中(尤其是使用JavaSE,例如JPA 2.0:Adding entity classes to PersistenceUnit *from different jar* automatically)。根据答案,没有简单的直接方法可以做到这一点。一种解决方案是在单个持久性单元文件中列出所有 jar 中的所有类,但这并不是很优雅。我可能不小心找到了另一种方法。通常我所有的实体类都是使用annotations映射的。至于解决方案: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 映射的情况下使用注释。

以下是JPA 2.0 规范的摘录:

12.1 XML 描述符的使用

... entity-mappings 元素的 persistence-unit-defaults 子元素中包含的 xml-mapping-metadata-complete 子元素的缺失或存在控制是否使用 XML 对象/关系映射描述符来选择性地覆盖注释值,或者是否它是 Java 语言元数据注释的完整替代品。

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

于 2013-05-07T12:33:09.117 回答