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我认为最好的解决方案是不设置“方言”属性,让 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休眠方言的主要内容,如果未能解决你的问题,请参考以下文章