0

我使用hibernate来管理我项目中的一些类。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]

所以看起来创建表时没有使用方言。

有办法吗?

4

3 回答 3

0

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

于 2013-03-29T08:55:59.900 回答
0

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

将类型 MEDIUMTEXT 创建为 VARCHAR(100000)

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

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

registerColumnType( Types.LONGVARCHAR, "longvarchar" );

于 2013-03-29T13:11:16.013 回答
0

当您按如下方式注册 varchartype 时

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

您实际上是在说所有大小 <=16777215 的 varchars 都将注册为 mediumtext,而不是相反。所以改变列注释的想法是错误的。此外,ne 不应该将特定于 DB 的东西推到休眠状态。

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

于 2013-04-03T10:46:50.200 回答