设为首页 收藏本站
查看: 616|回复: 0

[经验分享] 一步一步升级配置14: Mysql数据库,hibernate.dialect 使用MySQL5Dialect 替代 MySQLDialect

[复制链接]

尚未签到

发表于 2016-10-22 09:20:14 | 显示全部楼层 |阅读模式
一步一步升级配置14: Mysql数据库,hibernate.dialect使用org.hibernate.dialect.MySQL5Dialect替代org.hibernate.dialect.MySQLDialect
 
.背景:
 
最近一个项目,使用的hibernate jpa正向生成数据库表主键及索引 index
 
不过,发现一些表, @Entity类里面明明写了 index
 
/**
 * Gets the 商品标题,不能超过300字节.
 *
 * @return the 商品标题,不能超过300字节
 */
@Column(name = "TITLE", length = 300)
@Index(name = "I_PRODUCT_ITEM_TITLE")
public String getTitle() {
return title;
}
 
但是生成的数据库表, title字段却没有索引
 
 
.故障排查
 
2.1 checkcolumn type
检查了下这张表的title字段 ,发现  title字段的类型是 longtext
 

DSC0000.png
 

 
2.2 check create index log
并且执行, hibernate.hbm2ddl.auto update的时候,发现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)的字段
 

DSC0001.png
 
 
      并且成功创建了索引
 
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类型
 

DSC0002.png
 
 
2.5 try fix(尝试3):
 
        多次尝试,发现临界点在 length 255
 
 
.思考:
 
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类型
 
后来一想,肯定是 hibernate mapping mysql数据库,生成表的地方有问题,就想看看String 和数据库字段匹配的地方
我们原来使用的是  org.hibernate.dialect.MySQLDialect
 
.源码:
 
4.1  org.hibernate.dialect.MySQLDialect
 
源码中:
 
 
DSC0003.png
 

 
 
原来在这里, 如果长度<=255,那么就创建 varchar($1)类型
否则创建 longtext类型
 
这里有个文章http://dev.mysql.com/doc/refman/5.0/en/char.html
mysql5.0.3之前,varchar最大长度是255, 5.0.3之后的版本是 65535长度
 

DSC0004.png
 
 
 
 
4.2 org.hibernate.dialect.MySQL5Dialect
 
源码中,还有个MySQL5Dialect
 
如果长度<=65535,那么就创建 varchar($1)类型
否则创建 longtext类型
 
 
DSC0005.png
 

 
 
 
 
尝试着将sessionFactory hibernateProperties中的hibernate.dialect换成org.hibernate.dialect.MySQL5Dialect
 (扩展阅读开箱即用(配置过程),使用spring 减少配置hibernate mapping 的痛苦(AnnotationSessionFactoryBean))
 

DSC0006.png
 
 
重新执行hibernate.hbm2ddl.auto update
 
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)
 
 

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

DSC0008.png
 
 
 
 
 
参考:
 
 
       http://dev.mysql.com/doc/refman/5.0/en/char.html
 
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289684-1-1.html 上篇帖子: mysql查询今天,昨天,近7天,近30天,本月,上一月数据方法 下篇帖子: MySQL Cluster初步测试结果汇总图示报告 --> 用mysqlslap与sysbench进行测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表