![](/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.