eclipselink:用不同的jar丢失交易

时间:2013-12-17 17:13:30

标签: java-ee jpa transactions eclipselink jboss7.x

我有一个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文件中打包实体类?

我的环境:

  • JBoss 7.1.1
  • eclipselink 2.5.1

谢谢, 斯特芬

1 个答案:

答案 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>