[英]Accessing multiple databases using 2pc, hibernate, Java EE, Jboss EAP
我在这里有一个问题,我必须假设其他人之前也曾经遇到过这个问题。 到现在已经三个星期了,我已经没有选择权了。
环境:
这个想法是能够使用xa-resource进行我的事务管理,从而在单个事务中写入两个数据源。 我有两个数据库,它们的表均由不同的实体表示。
我的服务Bean由War层中的受管Bean通过在构造后注入的服务接口调用。
我的服务实现具有一个注入的实体管理器(em),该实体管理器以持久性上下文注释,将目标数据库指定为“ unitName”。 服务bean调用实体接口实现,将选择的em作为参数传递,最终em由基础实体接收,而基础实体又执行db操作。
我的应用程序分为3个模块/层:web = war,services = jar和domain = jar,其中EAR为主要存档。 我的问题实际上是在后端。
我首先在持久性xml中添加了以下内容:
我有一个基础实体,也有一个存储库包,其中包含我的接口及其实现以与数据库交互。
现在,当我以这种方式运行安装程序时,我的两个数据库每个都有正好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.