mysql的hsql休眠方言

Posted

技术标签:

【中文标题】mysql的hsql休眠方言【英文标题】:hsql hibernate dialect for mysql 【发布时间】:2013-03-29 08:47:37 【问题描述】:

我使用 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]

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

有办法吗?

【问题讨论】:

问题是 org.hibernate.cfg.Configuration#buildSessionFactory() 不像类中的其他方法那样使用方言。见grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…所以看起来没有出路。 看看:grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…,mediumtext 正在被评论。应该找出原因。 正在使用方言:刚刚从休眠示例应用程序启动中取出日志。 信息:JDBC 驱动程序:MySQL-AB JDBC 驱动程序,版本:mysql-connector-java-5.1.22(修订版:$bzr.revision-id) 2013 年 3 月 29 日 2: 44:56 PM org.hibernate.dialect.Dialect 信息:使用方言:org.hibernate.dialect.MySQLDialect 好的,你说的应用启动是指会话工厂建立的时间? 是的,我就是这个意思。 【参考方案1】:

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

【讨论】:

这个我试过了,这个也不行。 Hibernate 会检测到 HSQL 是数据库并且会使用 HSQLDialect 并且下面的问题会再次出现。错误 [SchemaExport] 错误的数据类型:语句 [create table TABLE_NAME (ID bigint not null, VALUE mediumtext] 中的 MEDIUMTEXT)【参考方案2】:

您可以使用 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");

【讨论】:

是的,HSQLDB 2.x 版本确实支持 MEDIUMTEXT etx,但我的问题是休眠方言。 hibernate 中是否有可以从 *.hbm.xml 文件中理解“MEDIUMTEXT”的休眠方言?比如 org.hibernate.dialect.HSQL2xDialect 左右?我正在使用休眠 3.6。【参考方案3】:

当你如下注册一个 varchartype 时

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

您实际上是在说所有大小

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

【讨论】:

以上是关于mysql的hsql休眠方言的主要内容,如果未能解决你的问题,请参考以下文章

具有限制的休眠、HSQL 和更新

无法使用休眠插入 hsql 数据库

MSSQL 2014 的错误休眠方言

休眠 - 方言已配置但仍然出现错误

JBoss EAP 7.2 Oracle 休眠方言

在内存数据库中嵌入 HSQL 的 Spring DataSource 和 Linux 上的休眠创建-删除排序