java - 使用 2pc、hibernate、Java EE、Jboss EAP 访问多个数据库
问题描述
我在这里有一个问题,我必须假设其他人之前一定遇到过这个问题。现在已经 3 周了,我已经没有什么选择了。
环境:
- Jboss eap 7
- 爪哇 8
- Java EE 7
- Postgres
- 休眠 5 倍
- Linux
这个想法是能够使用 xa-resource 在单个事务中写入两个数据源以进行事务管理。我有两个数据库,它们都有由不同实体表示的不同表。
我的服务 bean 由来自战争层的托管 bean 通过在构建后注入的服务接口调用。
我的服务实现有一个注入的实体管理器(em),它使用持久性上下文进行注释,将目标数据库指定为“unitName”。服务 bean 调用实体接口实现,将选择的 em 作为参数传递,最终 em 由基础实体接收,后者依次执行 db 操作。
我的应用程序分为 3 个模块/层 web=war、services=jar 和 domain=jar,其中 EAR 作为主要存档。我的问题实际上在后端。
我首先在我的持久性 xml 中添加了以下内容:
- 创建了 2 个持久性单元(PU1 有 15 个实体,PU2 有 17 个列在类元素中)
- 交易类型 = JTA
- exclude-unlisted-classes = false 和
- hibernate.hbm2ddl.auto is = 更新
我有一个基本实体,实体还有一个存储库包,其中包含我的接口及其实现以与我的数据库交互。
现在,当我像这样运行我的设置时,我的两个数据库每个都有 32 个表,并且我的表中的一些列合并了,即我有 table1,db1 中有字段 a、b 和 c,然后我也有 table1(同名)在具有字段 d、e 和 f 的 db2 中,它们数据库中的两个表都以列 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。更改后,现在一切正常。
推荐阅读
- java - 尝试在空对象引用上调用虚拟方法 'void de.hdodenhof.circleimageview.CircleImageView.setOnClickListener...'
- javascript - 我将如何阻止或欺骗模糊事件侦听器?
- rest - 从批处理调用 REST API
- javascript - 为每个用户划分数量
- angularjs - AngularJS:加载动画时间
- ibm-cloud-infrastructure - 如何确定裸机设备有 GPU 以及什么类型的 GPU?
- ios - MVVM 设计模式实现
- python - “微秒”是 replace() 的无效关键字参数
- dashboard - Dash 未成功导入。确保当前目录中没有名为“dash.py”的文件
- google-sheets - 使用带有 ImportRange 的 Query 计算文本