一尘不染

多个jar,单个持久单元解决方案?

java

包括我在内的一些人一直在努力将来自不同模块(jar)的实体合并到单个持久性单元中(尤其是 JavaSE ,例如此处的JPA 2.0:从不同的jar自动将实体类添加到PersistenceUnit中)。根据答案,没有简单直接的方法可以做到这一点。解决方案之一是在单个持久性单元文件中列出所有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映射文件使用,还是仅仅是我的持久性提供程序(休眠)的副作用?


阅读 159

收藏
2020-12-03

共1个答案

一尘不染

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

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

这是JPA 2.0规范的摘录:

12.1 XML描述符的使用

…实体映射元素的persistence-unit-defaults子元素中包含的xml-mapping-metadata-
complete子元素的不存在或存在控制着XML对象/关系映射描述符是否用于选择性地覆盖注释值,或者是否它可以完全替代Java语言元数据注释。

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

2020-12-03