簡體   English   中英

適用於mysql的hsql休眠方言

[英]hsql hibernate dialect for mysql

我使用休眠來管理項目中的某些類。 MySQL 5.5是底層的RDMS。

因此,對於常規操作,我使用org.hibernate.dialect.MySQL5InnoDBDialect作為休眠方言。

但是對於單元測試,我使用的是hsql 1.8.0.8,並且我使用org.hibernate.dialect.HSQLDialect作為測試的方言。

直到我們團隊中的一位開發人員將“ varchar”列更改為“ mediumtext”時,這才成為問題。

現在,我不能使用下面的HSQLDialect或MySQL5InnoDBDialect進行單元測試。

我嘗試編寫自己的從HSQLDialect擴展過來的方言,並將類型注冊為

registerColumnType( Types.VARCHAR, 16777215, "mediumtext" );

在構造函數中,但這似乎不起作用。

我寫的自定義方言如下

import org.hibernate.dialect.HSQLDialect;

public class HSqlMySqlDialect extends HSQLDialect{
     public HSqlMySqlDialect() {
            super();
            registerColumnType( Types.VARCHAR, "mediumtext" );
     }

}

我的測試hibernate.cfg.xml如下所示

<property name="dialect">com.alcatel.util.hibernate.HSqlMySqlDialect</property>
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:mem:testDB</property>

我在啟動ibernate sessionfactory時遇到的錯誤如下

ERROR [SchemaExport] Wrong data type: MEDIUMTEXT in statement [create table TABLE_NAME (ID bigint not null, VALUE mediumtext]

因此,看起來在創建表時未使用方言。

有辦法嗎?

我認為最好的解決方案是不要設置“ dialect”屬性,而讓Hibernate在運行時自動檢測正確的方言。

您可以使用HSQLDB 2.x並為MEDIUMTEXT定義類型。 例如:

創建類型為VARCHAR的MEDIUMTEXT(100000)

HSQLDB 2.x具有MySQL語法兼容模式,該模式當前支持TEXT和CTEXT類型定義。 下一版本可能支持MEDIUMTEXT。

對於版本1.8和2.x,只有一個Hibernate方言。 您應該能夠在方言子類中將MEDIUMTEXT類型定義為LONGVARCHAR。

registerColumnType(Types.LONGVARCHAR,“ longvarchar”);

當您注冊如下的varchartype時

registerColumnType( Types.VARCHAR, 16777215 , "mediumtext" );

您實際上是說所有大小小於等於16777215的varchars都將被注冊為中文本,而不是相反。 因此,更改列注釋的想法是錯誤的。 而且,不應將特定於DB的內容休眠。

所以對我來說,解決方案是在休眠注釋中使用varchar()本身,但通過自定義方言將它們轉換為我需要的任何類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM