使用2pc,休眠,Java EE,Jboss EAP

时间:2018-08-09 15:33:04

标签: java hibernate

我在这里遇到了一个问题,我必须假设其他人之前一定曾经遇到过这个问题。到现在已经三周了,我已经没有nou选项了。

环境:

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

该想法是能够使用xa-resource进行事务管理,从而在单个事务中写入两个数据源。我有两个数据库,它们的表均由不同的实体表示。

我的服务bean是由war层中的受管bean通过在构造后注入的服务接口调用的。

我的服务实现具有一个注入的实体管理器(em),该实体管理器(em)带有将目标数据库指定为“ unitName”的持久性上下文。服务bean调用实体接口实现,将选择的em作为参数传递,最终em由基础实体接收,而基础实体又执行db操作。

我的应用程序分为3个模块/层:web = war,services = jar和domain = jar,其中EAR为主要档案。我的问题实际上是在后端。

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

  1. 创建了2个持久性单元(PU1有15个实体,PU2有17个在类元素中列出)
  2. transaction-type = JTA
  3. exclude-unlisted-classes = 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

并且目标数据库表中存在“名称”列。

有没有人可以帮助我解决上述情况?预先感谢。

1 个答案:

答案 0 :(得分:0)

因此,事实证明我错过了在我的服务bean方法之一中指定目标PU的过程。更改之后,现在一切正常。