我在这里遇到了一个问题,我必须假设其他人之前一定曾经遇到过这个问题。到现在已经三周了,我已经没有nou选项了。
环境:
该想法是能够使用xa-resource进行事务管理,从而在单个事务中写入两个数据源。我有两个数据库,它们的表均由不同的实体表示。
我的服务bean是由war层中的受管bean通过在构造后注入的服务接口调用的。
我的服务实现具有一个注入的实体管理器(em),该实体管理器(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
并且目标数据库表中存在“名称”列。
有没有人可以帮助我解决上述情况?预先感谢。
答案 0 :(得分:0)
因此,事实证明我错过了在我的服务bean方法之一中指定目标PU的过程。更改之后,现在一切正常。