【问题标题】:JPA em.find(id) works on Oracle but not on MariaDBJPA em.find(id) 适用于 Oracle 但不适用于 MariaDB
【发布时间】:2018-11-23 19:52:52
【问题描述】:

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

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;

与 ExtractedValues 的 OneToOne 关系导致 MariaDB 出现问题。 我试过设置

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

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

【问题讨论】:

    标签: oracle hibernate jpa mariadb


    【解决方案1】:

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

    org.hibernate.dialect.MariaDBDialect
    

    或

    org.hibernate.dialect.MariaDB53Dialect
    

    【讨论】:

    • 感谢您的回答。
    • 如果提供的解决方案有效,请接受答案:)
    【解决方案2】:

    我希望你没有通过正确的方言。请检查方言。

    您可以使用以下方言。

    org.hibernate.dialect.MariaDBDialect
    

    【讨论】:

      【解决方案3】:

      感谢您的回答 我用两种方言都试过了

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

      不幸的是,JBoss 然后拒绝部署战争

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-14
        • 2011-03-12
        • 2021-06-24
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 1970-01-01
        相关资源
        最近更新 更多