簡體   English   中英

使用2pc,休眠,Java EE,Jboss EAP訪問多個數據庫

[英]Accessing multiple databases using 2pc, hibernate, Java EE, Jboss EAP

我在這里有一個問題,我必須假設其他人之前也曾經遇到過這個問題。 到現在已經三個星期了,我已經沒有選擇權了。

環境:

  • Jboss EAP 7
  • Java 8
  • Java EE 7
  • Postgres的
  • 休眠5倍
  • Linux的

這個想法是能夠使用xa-resource進行我的事務管理,從而在單個事務中寫入兩個數據源。 我有兩個數據庫,它們的表均由不同的實體表示。

我的服務Bean由War層中的受管Bean通過在構造后注入的服務接口調用。

我的服務實現具有一個注入的實體管理器(em),該實體管理器以持久性上下文注釋,將目標數據庫指定為“ unitName”。 服務bean調用實體接口實現,將選擇的em作為參數傳遞,最終em由基礎實體接收,而基礎實體又執行db操作。

我的應用程序分為3個模塊/層:web = war,services = jar和domain = jar,其中EAR為主要存檔。 我的問題實際上是在后端。

我首先在持久性xml中添加了以下內容:

  1. 創建了2個持久性單元(PU1具有15個實體,PU2具有17個在類元素中列出的實體)
  2. 交易類型= JTA
  3. 排除未列出的類= false和
  4. hibernate.hbm2ddl.auto是=更新

我有一個基礎實體,也有一個存儲庫包,其中包含我的接口及其實現以與數據庫交互。

現在,當我以這種方式運行安裝程序時,我的兩個數據庫每個都有正好32個表,並且我的表具有合並的某些列,即我在db1中具有帶有字段a,b和c的table1,那么我也有table1(同名)在db2中,具有字段d,e和f,數據庫中的兩個表都以a,b,c,d,e和f列結尾。

如果我按如下方式操作persistence.xml:

<persistence-unit name="PU1" transaction-type="JTA">
    <jta-data-source>java:jboss/datasources/db1</jta-data-source>
    <properties>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
    </properties>
    <class>domain.org.PemsBusinessArea</class>
    ...

</persistence-unit>
<persistence-unit name="PU2" transaction-type="JTA">
    <jta-data-source>java:jboss/datasources/db2</jta-data-source>
    <properties>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
    </properties>
    <class>domain.org .KeyFields</class>
    ...
</persistence-unit>

然后部署並運行我的應用程序,但最終出現以下異常:

Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2117)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1900)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1876)
at org.hibernate.loader.Loader.doQuery(Loader.java:919)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
at Caused by: org.postgresql.util.PSQLException: ERROR: column plexusbusi0_.name does not exist

並且目標數據庫表中存在“名稱”列。

有沒有人可以幫助我解決上述情況? 提前致謝。

因此,事實證明我錯過了在一種服務bean方法中指定目標PU的問題。 更改之后,現在一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM