• 技术文章 >数据库 >mysql教程

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

    2016-06-01 13:12:49原创796
    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

    源码中:



    原来在这里,如果长度<=255,那么就创建varchar($1)类型

    否则创建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

    如果长度<=65535,那么就创建varchar($1)类型

    否则创建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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:数据库表 项目
    上一篇:OurSQL Episode 186: Data at OSCon_MySQL 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 简单聊聊MySQL中join查询• 深入理解MySQL索引优化器工作原理• 实例分析MySQL中pt-query-digest工具的使用记录• MySQL子查询详细教程• MySQL获取时间、格式转换各类操作方法详解
    1/1

    PHP中文网