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
网钛商城系统是个易用美观功能强大的一套商城系统,使用PHP语言,数据库有ACCESS和MYSQL两种。这套系统经过多家企业两年的使用,经功能汇总而整理出来,功能强大, 配置灵活,操作人性化,很容易上手,属于较成熟的PHP商城系统,允许个人按照自己的意愿修改和配置。我们今后还会定期的进行升级和修改。免费版仅可以使用Access数据库。
101
三.思考:
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
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号