用于mysql的hsql hibernate方言

时间:2013-03-29 08:47:38

标签: java mysql hibernate hsqldb

我使用hibernate来管理项目中的一些类。 MySQL 5.5是底层的RDMS。

因此对于常规操作,我使用org.hibernate.dialect.MySQL5InnoDBDialect作为hibernate方言。

但是对于单元测试,我使用的是hsql 1.8.0.8,并使用org.hibernate.dialect.HSQLDialect作为测试方言。

在我的团队中的一位开发人员将“varchar”列更改为“mediumtext”之前,这不是问题。

现在我不能使用nether 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]

所以看起来在创建表时不使用方言。

有办法吗?

3 个答案:

答案 0 :(得分:0)

我认为最好的解决方案是不设置“方言”属性,让Hibernate在运行时自动检测正确的方言。

答案 1 :(得分:0)

您可以使用HSQLDB 2.x并为MEDIUMTEXT定义类型。例如:

创建类型MEDIUMTEXT AS VARCHAR(100000)

HSQLDB 2.x具有MySQL语法兼容模式,目前支持TEXT和CTEXT类型定义。下一版本可能支持MEDIUMTEXT。

版本1.8和2.x有一种Hibernate方言。您应该能够在方言子类中将MEDIUMTEXT类型定义为LONGVARCHAR。

registerColumnType(Types.LONGVARCHAR,“longvarchar”);

答案 2 :(得分:0)

注册varchartype时,如下所示

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

你实际上是说所有尺寸为&lt; = 16777215的varchars都将被注册为中间文本,而不是相反。因此,更改列注释的想法是错误的。此外,ne不应该将特定于DB的内容推送到休眠状态。

所以我的解决方案是在hibernate注释中使用varchar()本身,但是通过自定义方言将它们转换为我需要的任何类型。