我有一个jar库(或eclipse中的项目),它有自己的持久性单元(META-INF / persistence.xml)和一些实体类,另一个项目(B)使用这个。在项目B中,还有持久性单元和实体类。
在项目BI中,需要使用项目A和B中的两个实体类。但是如果我将“A”设置为持久性单元名称,如果此查询位于项目B的实体中,则EntityManager无法创建命名查询。如果我设置“B” “作为持久性单元名称,它无法从项目A的实体创建命名查询。错误消息是:
NamedQuery of name: MyEntityName.myQueryName not found.
持久性单位能以某种方式包含其他持久性单位吗?或者还有其他方法可以解决这个问题吗?
答案 0 :(得分:4)
EclipseLink 2.3引入了Composite Persistence Units,它允许您创建一个持久性单元,它基本上只作为两个或多个实际持久性单元的容器。然后,您就可以在应用程序中使用此单一复合持久性单元,就好像您只有一个持久性单元一样。这应该符合您的目标,即保持persistence.xml文件的清洁,以便轻松地将模型同步到数据库。很酷的东西。
答案 1 :(得分:2)
您可以在一个持久性单元中列出A所需的类,而另一个类中需要B的类:
<persistence ...>
<persistence-unit name="projectA" ...>
....
<class>a.Class1</class>
<class>a.Class2</class>
<class>a.Class3</class>
</persistence-unit>
<persistence-unit name="projectB" ...>
...
<class>a.Class1</class>
<class>a.Class2</class>
<class>a.Class3</class>
<class>b.Class1</class>
<class>b.Class2</class>
<class>b.Class3</class>
</persistence-unit>
</persistence>
或者,您可以使用&lt; jar-file&gt; 元素,引用JPA规范(6.2.1.6):“如果指定,将搜索这些JAR文件以进行管理持久化类,以及在它们上找到的任何映射元数据注释都将被处理,或者它们将使用本规范定义的映射注释默认值进行映射。这些JAR文件是相对于持久性单元的根指定的(例如,utils / myUtils。罩)。“
<persistence ...>
<persistence-unit name="projectA" ...>
...
<jar-file>relative/path/to/your/library.jar</jar-file>
</persistence-unit>
</persistence>