当前位置: 首页 > 面试题库 >

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

姬和歌
2023-03-14
问题内容

包括我在内的一些人一直在努力将来自不同模块(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映射文件使用,还是仅仅是我的持久性提供程序(休眠)的副作用?


问题答案:

是的,这是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映射文件中,并且将忽略类上的所有持久性注释。



 类似资料:
  • 包括我在内的一些人一直在努力将不同模块(JAR)中的实体合并到一个持久单元中(特别是使用JavaSE,例如这里的JPA2.0:自动将实体类添加到PersistenceUnit(来自不同的JAR)中)。基于这些答案,没有简单直接的方法可以做到这一点。解决方案之一是在单个持久性单元文件中列出所有JAR中的所有类,但这并不是很好。我可能无意中找到了另一条路。通常,我的所有实体类都使用注释进行映射。至于解

  • 有没有办法将quarkus security jpa与多个持久性单元一起使用?JpaIdentityProvider似乎直接注入了实体管理器工厂,这导致了“javax.persistence.EntityManagerFactory类型的不满意依赖”的异常。 可能有解决办法吗? 有什么建议吗? 谢谢文森特

  • 我有一个应用程序,它使用位于两个不同数据库中的一组JPA实体。我配置了多个持久性单元。 问题是我想使用模式生成自动生成模式,所有实体都是在两个数据库中创建的。 我在这两方面都有: 是的,我想使用元数据自动获取实体。我不想提供手动脚本,因为我需要使它与实体保持最新。 是否有方法标记由哪个PU生成的实体? 编辑:请注意,在@Table上添加“模式”属性并不能解决问题,因为每个PU将尝试在正确的模式中创

  • 问题内容: 我需要一些帮助,以使用同一持久性单元配置多个数据库的多个连接。 它们都具有相同的架构。因此,我想使用相同的持久性单元/ DAO等,而又不想设置10个EntityManager,10个持久性xml等。有没有办法做到这一点?这是我当前的配置: 我也在使用Spring / hibernate来设置我的上下文: 最后我使用: 将我的EntityManager注入我的DAO 如何扩展此模型以能够

  • 我有一个用例,我想我需要两个实体管理器,它们访问相同的持久性单元。所以本质上,我希望在同一个数据库上有两个持久性上下文。这是否可以通过PersistenceContext注释实现? 我想写以下内容,但不知道如何告诉JPA注入两个不同的manager实例。 我想我可以切换到应用程序管理的事务,然后我可以使用工厂创建另一个事务。但是我不想自己管理事务,如果不是绝对必要的话。

  • 问题内容: 我需要一些帮助,以使用相同的持久性单元配置多个数据库的多个连接。 它们都具有相同的架构。因此,我想使用相同的持久性单元/ DAO等,而又不想设置10个EntityManager,10个持久性xml等。有没有办法做到这一点?这是我当前的配置: 我也在使用Spring / hibernate来设置我的上下文: 最后我使用: 将我的EntityManager注入我的DAO 如何扩展此模型以能