首页 > 解决方案 > 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>

标签: oraclehibernatejpamariadb

解决方案


我建议您使用以下任一方言:

org.hibernate.dialect.MariaDBDialect

或者

org.hibernate.dialect.MariaDB53Dialect

推荐阅读