使用2pc、hibernate、Java EE、Jboss EAP访问多个数据库

使用2pc、hibernate、Java EE、Jboss EAP访问多个数据库,java,hibernate,Java,Hibernate,我这里有一个问题,我必须假设以前一定有人碰到过。现在已经三个星期了,我已经没有选择了 环境: JBossEAP7 爪哇8 Java EE 7 博士后 冬眠5x Linux 其思想是能够使用xa资源在一个事务中写入两个数据源以进行事务管理。我有两个数据库,它们都有不同的表,由不同的实体表示 我的服务bean由war层的托管bean在后期构造时通过注入的服务接口调用 我的服务实现有一个注入的实体管理器(em),用持久性上下文注释,将目标数据库指定为“unitName”。服务bean调用实体接口实

我这里有一个问题,我必须假设以前一定有人碰到过。现在已经三个星期了,我已经没有选择了

环境:

  • JBossEAP7
  • 爪哇8
  • Java EE 7
  • 博士后
  • 冬眠5x
  • Linux
其思想是能够使用xa资源在一个事务中写入两个数据源以进行事务管理。我有两个数据库,它们都有不同的表,由不同的实体表示

我的服务bean由war层的托管bean在后期构造时通过注入的服务接口调用

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

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

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

  • 创建了2个持久性单元(PU1有15个实体,PU2有17个实体列在类元素中)
  • 交易类型=JTA
  • 排除未列出的类=false和
  • hibernate.hbm2ddl.auto is=更新
  • 我有一个基本实体、多个实体,还有一个存储库包,它保存我的接口及其实现,以便与数据库交互

    现在,当我像这样运行我的设置时,我的两个数据库都正好有32个表,每个表都有一些列合并,也就是说,我的表1在db1中有字段a、b和c,然后我在db2中也有字段d、e和f的表1(同名),它们的数据库中的两个表都以列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>
    
    并且“name”列存在于目标数据库表中


    有没有人能帮我解决上述问题?提前感谢。

    因此,我发现在我的一个服务bean方法中没有指定目标PU。在这一变化之后,一切都很顺利

    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