JPA em.find(id)适用于Oracle,但不适用于MariaDB
您好,我有一个应用程序运行在JBoss EAP 7上,带有JPA Hibernate 我在一个简单的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_,
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"/>