0

我正在开发一个使用非常旧版本的 Jboss(4.0.5 - JDK 1.5)的项目。由于时间/预算限制,我无法改变这一点。

我的应用程序部署为单个 EAR 文件。在耳朵之内,有一个提供基本实体管理的 JAR 文件。调用它jpa-old.jar。该 JAR 文件包含一个 persistence.xml,它定义了一个 PU OldPersist,如下所示:

<persistence version="1.0" >
 <persistence-unit name="OldPersist">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <jta-data-source>java:/MySqlDS</jta-data-source>
  <class>com.oldjpa.OldEntity1</class>
  <class>com.oldjpa.OldEntity2</class>
  <exclude-unlisted-classes>true</exclude-unlisted-classes> 
 </persistence-unit>
</persistence>

jar 提供实体本身以及一些用于 CRUD 操作的访问 EJB。EntityManger 被注入到 EJB 中@PersistenceContext(unitName = "OldPersist")

由于各种原因,不再需要维护旧的实体 jar(设计不佳,代码膨胀)。因此我想创建一个新的实体访问层。目前,它将仅通过 EJB 提供对新实体的访问,但随着时间的推移,旧代码将被移植到新的 JAR 中。两者必须同时工作。

所以我创建了一个新的jpa-new.jarJAR NewPersist(

<persistence version="1.0" >
 <persistence-unit name="NewPersist">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <jta-data-source>java:/MySqlDS</jta-data-source>
  <class>com.newjpa.NewEntity1</class>
  <class>com.newjpa.NewEntity2</class>
  <exclude-unlisted-classes>true</exclude-unlisted-classes> 
 </persistence-unit>
</persistence>

请注意,两个 PU 之间没有实体的交叉管理。

然后我在新的 JAR 中创建一些新的 EJB 并注入 EM@PersistenceContext(unitName = "NewPersist")

在部署时,我收到此错误:

WARN  [org.jboss.system.ServiceController] Problem starting service persistence.units:ear=MyEar.ear,unitName=jpa-new.jar org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.oldjpa.OldEntity1 references an unknown entity:com.oldjpa.OldEntity2

Hibernate 抱怨新的 PU - 关于应该由旧 PU 管理的实体。

我已经单独尝试了每个 JAR,它们都工作正常。我尝试添加<jar-file>到persistence.xml,但jboss 然后抱怨它在部署时找不到JAR(它假设是一个相对路径,但相对于什么?)。我尝试将共享的persistence.xml 添加到EARs META-INF。这并没有给出相同的错误,但是每个 JAR 文件中的 EJB 抱怨他们找不到他们的 PU。

所以我的问题是,是否支持这种配置(多个 jar,每个 jar 都有自己的 persistence.xml),如果支持,我该如何让它工作?

非常感谢

4

1 回答 1

1

为什么不创建一个包含 2 个持久性单元的单个 persistence.xml?

于 2013-03-13T02:33:57.977 回答