小编Sor*_*cha的帖子

EJB3 - 在事务中使用2个持久性单元(例外:本地事务已经有1个非XA资源)

我试图在Glassfish上部署的Java EE应用程序中的同一事务中使用2个持久性单元.

这两个持久性单元在persistence.xml中定义,如下所示:

<persistence-unit name="BeachWater">
<jta-data-source>jdbc/BeachWater</jta-data-source>
...
<persistence-unit name="LIMS">
<jta-data-source>jdbc/BeachWaterLIMS</jta-data-source>
...
Run Code Online (Sandbox Code Playgroud)

这些持久性单元对应于我在Glassfish中定义的JDBC资源和连接池,如下所示(这里包括一个,因为两者在名称和数据库连接信息之外是相同的):

JDBC Resource:
JNDI Name: jdbc/BeachWaterLIMS
Pool Name: BEACHWATER_LIMS

Connection Pool:
Name: BEACHWATER_LIMS
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource
Resource Type: javax.sql.ConnectionPoolDataSource
Run Code Online (Sandbox Code Playgroud)

有3个无状态会话bean,LimsServiceBean,AnalysisServiceBean和AnalysisDataTransformationServiceBean.

以下是LimsServiceBean的相关摘录:

@PersistenceContext(unitName = "LIMS")
EntityManager em;
...
public ArrayList<Sample> getLatestLIMSData() {
    Query q = em.createNamedQuery("Sample.findBySubTypeStatus");
    return new ArrayList<Sample>(q.getResultList());
}
Run Code Online (Sandbox Code Playgroud)

来自AnalysisServiceBean:

@PersistenceContext(unitName = "BeachWater")
EntityManager em;
...
public ArrayList<AnalysisType> getAllAnalysisTypes() {
    Query q = em.createNamedQuery("AnalysisType.findAll");
    return new ArrayList<AnalysisType>(q.getResultList());
}
Run Code Online (Sandbox Code Playgroud)

并从AnalysisDataTransformationServiceBean:

@EJB
private AnalysisService analysisService;

@EJB
private LimsService limsService;

public void …
Run Code Online (Sandbox Code Playgroud)

transactions glassfish multiple-databases persistence-unit ejb-3.0

9
推荐指数
2
解决办法
1万
查看次数