我有一个JEE应用程序。这些JEE应用程序的类打包在两个不同的jar中,这两个jar都是EAR文件的成员。
假设我有一个JPA实体“DataEntity”(打包在jar“a.jar”中)。
在第一个JAR文件中,“a.jar”也存储在类:
之后@Stateless
@LocalBean
public class A_Bean {
@PersistenceContext(unitName = "testApp")
private EntityManager em;
public void testMethod(DataEntity obj) {
if (em.contains(obj) log.info("CONTAINED a 1");
else {
obj = em.merge(obj);
em.refresh(obj);
}
if (em.contains(obj) log.info("CONTAINED a 2");
}
}
在第二个JAR文件“b.jar”中,我有以下课程:
@Stateless
@LocalBean
public class B_Bean {
@PersistenceContext(unitName = "testApp")
private EntityManager em;
public void testMethod(DataEntity obj) {
if (em.contains(obj) log.info("CONTAINED b 1");
else {
obj = em.merge(obj);
em.refresh(obj);
}
if (em.contains(obj) log.info("CONTAINED b 2");
}
}
现在我假设将从EJB容器外部调用以下调用(意味着指定的DataEntity“dataObj”当前不由EntityManager管理):
a.testMethod(dataObj);
显示预期的输出:
CONTAINED a 2
但如果我打电话
b.testMethod(dataObj);
我得到了
Exception: javax.persistence.TransactionRequiredException
at org.jboss.as.jpa.container.AbstractEntityManager.transactionIsRequired(AbstractEntityManager.java:692)
at org.jboss.as.jpa.container.AbstractEntityManager.merge(AbstractEntityManager.java:547)
at B_Bean.testMethod(B_Bean.java:xxx)
...
同时添加
@TransactionAttribute(TransactionAttributeType.REQUIRED)
没有帮助。
现在,在将类B_Bean移动到a.jar文件之后,B_Bean类也按预期工作。
必须将所有EntityBeans打包在同一个jar文件中吗?是否有一个技巧如何在不同的jar文件中打包实体类?
我的环境:
谢谢, 斯特芬
答案 0 :(得分:0)
是否有一个技巧如何在不同的jar文件中打包实体类?
JPA specification定义了几个持久性范围。
8.2.2持久性单位范围 EJB-JAR,WAR,应用程序客户机jar或EAR可以定义持久性单元。
在您的情况下,a.jar文件中打包的persistence.xml文件定义了一个持久性单元,该单元仅包含定义此jar的组件。
在EJB-JAR,WAR或应用程序客户机jar级别定义的持久性单元是 分别作用于EJB-JAR,WAR或应用程序jar,并且对组件可见 在那个罐子或战争中定义。
您可以通过多种方式扩展单元持久性的范围。例如,在EAR级别定义持久性单元:
在EAR级别定义的持久性单元通常对所有组件可见 在申请中......
其他可能性是修改a.jar中包含的persistence.xml并明确包含对b.jar的引用。
可以使用jar文件元素来指定一个或多个JAR文件,而不是使用jar文件元素 映射文件元素中指定的映射文件。如果指定,将搜索这些JAR文件 对于托管持久性类...这样的JAR文件是相对于包含persis的根的目录或jar文件指定的 tence unit。
<jar-file>b.jar</jar-file>