繁体   English   中英

如何获取多个持久性单元的EntityManager

[英]How to get EntityManager(s) for mulitple persistence units

我正在编写在WebSphere Liberty Profile 8.5.5中运行的JEE7应用程序。 我们正在使用JPA(通过WLP中的Eclipselink实现)。

我在同一个“ persistence.xml”文件中有多个持久性单元。 我还需要访问同一课程中的其中两个单元。

尝试使用第二个EntityManager时出现运行时错误:

@PersistenceContext(unitName = "wwer-list")
private EntityManager entityManagerWwerList;
@PersistenceContext(unitName = "main-dashboard")
private EntityManager entityManagerMainDashboard;

E WTRN0062E: An illegal attempt to use multiple resources that have only one-phase capability has occurred within a global transaction.  

我如何摆脱这个错误?

另外,我正在使用的所有表格仅需要阅读。 那么,如何指定我只希望对JPA具有只读访问权限?

出现此问题的原因是,您的一个数据源使用ConnectionPoolDataSource配置为(单阶段提交),而另一个数据源则配置了XADataSource。

如果要继续使用相同的数据源配置,则必须将服务器配置更新为“接受启发式危害”。

在管理控制台中,单击EAR,然后选中“接受启发式危害”复选框。 重新启动服务器。

启用最后参与者支持的此链接也可能会有所帮助。 http://www.ibm.com/support/knowledgecenter/SSAW57_7.0.0/com.ibm.websphere.nd.doc/info/ae/webui_pme/ui/ueac_laoextensionsettings.html

如果没有您的persistence.xml和server.xml配置,我无法确定,但是看起来支持<persistence-unit>配置的<dataSource>元素不具有XA功能。

默认情况下, <dataSource>应该是javax.sql.XADataSource (因此具有XA功能),但是,如果使用的是不提供XADataSource实现的JDBC驱动程序,Liberty将选择一个更简单的DataSource实现(即javax.sql.ConnectionPoolDataSource或纯javax.sql.DataSource )。

全局事务在您发出UserTransaction.begin()一直持续到您发出commit()rollback()为止。 您还可以通过其他方式进行全球交易。

由于您需要只读访问权限,因此将DataSources转换为XA可能会过大。 相反,尝试从等式中消除全局事务。 如果无法消除全局事务,则可以通过以下方式在server.xml中指定XADataSource:

<dataSource type="javax.sql.XADataSource" ...>
    <jdbcDriver .../>
    <properties .../>
</dataSource>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM