我正在开发一个使用非常旧版本的Jboss(4.0.5 - JDK 1.5)的项目。由于时间/预算的限制,我无法改变这一点。
我的应用程序部署为单个EAR文件。在耳内,有一个提供基本实体管理的JAR文件。称之为jpa-old.jar
。该JAR文件包含一个persistnce.xml,它定义了一个名为OldPersist
的PU,如下所示:
<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。使用@PersistenceContext(unitName = "OldPersist")
由于各种原因,它不再需要维护旧的实体jar(设计不佳,代码膨胀)。因此,我想创建一个新的实体访问层。现在,它将只通过EJB提供对新实体的访问,但随着时间的推移,旧代码将被移植到新的JAR。两者都必须同时工作。
所以我创建了一个与我的旧结构相同的新JAR(jpa-new.jar
),用这个persistnce.xml定义了一个新的PU 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,并使用@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>
添加到persistnce.xml中,但jboss然后抱怨它无法在部署中找到JAR(它假设是一个相对路径,但相对于什么?)。
我尝试将共享的persistnce.xml添加到EARs META-INF。这不会产生同样的错误,但是每个JAR文件中的EJB都会抱怨他们无法找到他们的PU。
所以我的问题是,是否支持这种配置(多个jar都有自己的persistnce.xml),如果是这样,我该如何让它工作?
非常感谢
答案 0 :(得分:1)
为什么不在其中创建一个包含2个持久性单元的persistence.xml?