Home  >  Article  >  Database  >  一步一步升级配置14: Mysql数据库,hibernate.dialect 使用MySQL5_MySQL

一步一步升级配置14: Mysql数据库,hibernate.dialect 使用MySQL5_MySQL

WBOY
WBOYOriginal
2016-06-01 13:12:491262browse

Hibernate

一步一步升级配置14:Mysql数据库,hibernate.dialect使用org.hibernate.dialect.MySQL5Dialect替代org.hibernate.dialect.MySQLDialect

一.背景:

最近一个项目,使用的hibernatejpa正向生成数据库表主键及索引index

不过,发现一些表, @Entity类里面明明写了index

/**

 * Gets the商品标题,不能超过300字节.

 *

 *@returnthe商品标题,不能超过300字节

 */

@Column(name ="TITLE", length = 300)

@Index(name ="I_PRODUCT_ITEM_TITLE")

publicStringgetTitle() {

returntitle;

}

但是生成的数据库表, title字段却没有索引

二.故障排查

2.1 checkcolumn type

检查了下这张表的title字段,发现  title字段的类型是longtext



 

2.2 check create index log

并且执行,hibernate.hbm2ddl.autoupdate的时候,发现log 里面有这么两句

19:56:36.352 [main] DEBUG o.h.tool.hbm2ddl.SchemaUpdate - create index I_PRODUCT_ITEM_TITLE on T_PRODUCT_ITEM (TITLE)

19:56:36.389 [main] ERROR o.h.tool.hbm2ddl.SchemaUpdate -Unsuccessful: create index I_PRODUCT_ITEM_TITLE on T_PRODUCT_ITEM (TITLE)

longtext类型的字段,不可以创建索引

2.3 try fix(尝试1):

我将length改成200,成功创建了varchar(200)的字段



 

     并且成功创建了索引

20:04:57.481 [main] DEBUG o.h.tool.hbm2ddl.SchemaUpdate - alter table T_PRODUCT_ITEM add column TITLE varchar(200)

20:04:57.768 [main] DEBUG o.h.tool.hbm2ddl.SchemaUpdate - create index I_PRODUCT_ITEM_TITLE on T_PRODUCT_ITEM (TITLE)

2.4 try fix(尝试2):

我将length改成260,又是longtext类型



 

2.5 try fix(尝试3):

       多次尝试,发现临界点在length255

三.思考:

3.1如果要交差,那么让大家把所有>255的字段的长度都改成255

但是这不是我的性格,我的性格是"事出反常必有妖"

3.2问题是,为毛length>255的字段生成的表字段却是longtext类型的?

原以为是我的hibernate/hibernate-annotations版本(3.5.1-Final)太低了,

我尝试了升级到3.6.10-Final/3.5.6-Final,结果还是longtext类型

后来一想,肯定是hibernatemapping mysql数据库,生成表的地方有问题,就想看看String和数据库字段匹配的地方

我们原来使用的是 org.hibernate.dialect.MySQLDialect

四.源码:

4.1 org.hibernate.dialect.MySQLDialect

源码中:

 

 

原来在这里,如果长度

否则创建longtext类型

这里有个文章: http://dev.mysql.com/doc/refman/5.0/en/char.html

在mysql5.0.3之前,varchar最大长度是255,在5.0.3之后的版本是65535长度



 

4.2 org.hibernate.dialect.MySQL5Dialect

源码中,还有个MySQL5Dialect

如果长度

否则创建longtext类型

 

 

尝试着将sessionFactoryhibernateProperties中的hibernate.dialect换成org.hibernate.dialect.MySQL5Dialect

 (扩展阅读: 开箱即用(配置过程),使用spring减少配置hibernate mapping的痛苦(AnnotationSessionFactoryBean))



 

重新执行hibernate.hbm2ddl.autoupdate

20:24:31.375 [main] DEBUG o.h.tool.hbm2ddl.SchemaUpdate - alter table T_PRODUCT_ITEM add column TITLE varchar(300)

20:24:31.661 [main] DEBUG o.h.tool.hbm2ddl.SchemaUpdate - create index I_PRODUCT_ITEM_TITLE on T_PRODUCT_ITEM (TITLE)



 

成功创建varchar(300)字段,并且成功创建索引



 

参考:

      http://dev.mysql.com/doc/refman/5.0/en/char.html

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn