JPA em.find(id)适用于Oracle,但不适用于MariaDB

JPA em.find(id)适用于Oracle,但不适用于MariaDB,oracle,hibernate,jpa,mariadb,Oracle,Hibernate,Jpa,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_,

您好,我有一个应用程序运行在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,它产生两个选择 休眠:

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=?
当我手动运行两个选择时,第一个选择返回一行,而第二个选择不返回。 这会导致find方法返回NULL。在我看来,这不是预期的结果

消息数据实体:

@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;
@Id
私有字符串id;
@OneToMany(级联=级联类型.ALL)
@JoinColumn(name=“messageid”,referencedColumnName=“messageid”,updateable=false)
私人设置的MSG信息;
@独身癖
@JoinColumn(name=“messageid”,referencedColumnName=“messageid”)
专用集协议;
@独身癖
@JoinColumn(name=“messageid”,referencedColumnName=“messageid”)
私有集重试;
@奥内托内
@JoinColumn(name=“messageid”,referencedColumnName=“messageid”,insertable=false,updateable=false)
私有提取值提取值;
OneToOne与ExtractedValues的关系导致了MariaDB上的问题。 我已经试着设置

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

在persistence.xml中,但这并不能解决问题。
我不知道该怎么办…

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

org.hibernate.dialect.MariaDBDialect


我希望你没有通过正规的方言考试。请检查一下方言

你可以用下面的方言

org.hibernate.dialect.MariaDBDialect
谢谢你的回答 两种方言我都试过了

       <property name="hibernate.dialect" value="org.hibernate.dialect.MariaDB53Dialect"/>

不幸的是JBoss拒绝部署战争

无法将名称[org.hibernate.dial.MariaDBDialect]解析为策略[org.hibernate.dial.dial]


无法将名称[org.hibernate.dial.MariaDB53Dialect]解析为策略[org.hibernate.dial.dialect]

谢谢您的回答。如果提供的解决方案有效,请接受答案:)
       <property name="hibernate.dialect" value="org.hibernate.dialect.MariaDB53Dialect"/>