![](/img/trans.png)
[英]How to inject multiple JPA EntityManager (persistence units) when using Spring
[英]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.