oracle - JPA em.find(id) 适用于 Oracle 但不适用于 MariaDB
问题描述
您好,我有一个在 JBoss EAP 7 和 JPA Hibernate 上运行的应用程序。
我有一个简单的entityManager.find(id)
电话问题。
该调用针对 Oracle 12 数据库生成一条 SQL
select messagedat0_.id as id1_4_0_,
messagedat0_.messageid as messageid3_4_0_,
messagedat0_.messageblob as messageblob2_4_0_,
messagedat0_.messagetype as messagetype4_4_0_,
messagedat0_.retaintime as retaintime5_4_0_,
extractedv1_.messageid as messageid1_1_1_,
extractedv1_.absender as absender2_1_1_,
extractedv1_.empfaenger as empfaenger3_1_1_,
extractedv1_.nachrichtentyp as nachrichtentyp4_1_1_,
extractedv1_.uuid as uuid5_1_1_
from messagedata messagedat0_
left outer join ExtractedValues extractedv1_ on messagedat0_.messageid=extractedv1_.messageid
where messagedat0_.id=?
返回实体。
针对 MariaDB,它会产生两个选择 Hibernate:
select messagedat0_.id as id1_4_0_,
messagedat0_.messageid as messagei3_4_0_,
messagedat0_.messageblob as messageb2_4_0_,
messagedat0_.messagetype as messaget4_4_0_,
messagedat0_.retaintime as retainti5_4_0_,
extractedv1_.messageid as messagei1_1_1_,
extractedv1_.absender as absender2_1_1_,
extractedv1_.empfaenger as empfaeng3_1_1_,
extractedv1_.nachrichtentyp as nachrich4_1_1_,
extractedv1_.uuid as uuid5_1_1_
from messagedata messagedat0_
left outer join ExtractedValues extractedv1_ on messagedat0_.messageid=extractedv1_.messageid
where messagedat0_.id=?
2018-11-22 09:46:36,328 INFO [stdout] (default task-26) Hibernate:
select extractedv0_.messageid as messagei1_1_0_,
extractedv0_.absender as absender2_1_0_,
extractedv0_.empfaenger as empfaeng3_1_0_,
extractedv0_.nachrichtentyp as nachrich4_1_0_,
extractedv0_.uuid as uuid5_1_0_
from ExtractedValues extractedv0_ where extractedv0_.messageid=?
当我手动运行两个选择时,第一个 Select 确实返回一行,第二个不返回。这会导致 find 方法返回 NULL。在我看来,这不是预期的结果。
来自 Messagedata 实体:
@Id
private String id;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="messageid", referencedColumnName="messageid", updatable=false)
private Set<Msginformation> msginformations;
@OneToMany
@JoinColumn(name="messageid", referencedColumnName="messageid")
private Set<Protocol> protocols;
@OneToMany
@JoinColumn(name="messageid", referencedColumnName="messageid")
private Set<Retry> retries;
@OneToOne
@JoinColumn(name="messageid", referencedColumnName="messageid", insertable=false, updatable=false)
private ExtractedValues extractedValues;
与 ExtractedValues 的 OneToOne 关系导致 MariaDB 出现问题。我试图设置
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
在persistence.xml 中,但这并不能解决问题。我不知道该怎么办……</p>
解决方案
我建议您使用以下任一方言:
org.hibernate.dialect.MariaDBDialect
或者
org.hibernate.dialect.MariaDB53Dialect
推荐阅读
- python - 如何在 Python 中制作赛车条形图可视化
- reactjs - 我收到一个错误 TypeError: Cannot read properties of undefined (reading 'reduce')
- php - WooCommerce 触发所有订单更新
- html - 使用Ajax Get方法在前端检索Mongodb数据
- google-play-services - 将预安装的应用程序上传到 Playstore 显示错误
- android - 如何在 Flutter 应用程序上实现新的 Android 11 双击返回手势?
- powershell - 如何使用 Powershell 获取 exe 应用程序详细信息
- flutter - Flutter CupertinoPicker 初始值来自先前的 CupertinoPicker 最后选择的值
- ms-word - 使 OfficeJs Word 加载项始终显示在功能区上
- python - 如何按重复次数对文本进行排序?