一步一步升级配置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
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)的字段
并且成功创建了索引
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):
多次尝试,发现临界点在 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
源码中:
原来在这里, 如果长度<=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类型
尝试着将sessionFactory hibernateProperties中的hibernate.dialect换成org.hibernate.dialect.MySQL5Dialect
(扩展阅读: 开箱即用(配置过程),使用spring 减少配置hibernate mapping 的痛苦(AnnotationSessionFactoryBean))
重新执行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)
成功创建 varchar(300) 字段,并且成功创建索引
参考:
http://dev.mysql.com/doc/refman/5.0/en/char.html
相关推荐
MySQL org.hibernate.dialect.MySQLDialect MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect Oracle (any version) org....
#hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect #hibernate.connection....
hibernate.dialect = org.hibernate.dialect.MySQLDialect //指定数据库使用的sql方言(oracle、mysql) hibernate.connection.driver_class=com.mysql.jdbc.Driver //指定数据库的驱动程序 hibernate.connection....
#hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect #hibernate.connection....
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect <!-- 可选配置 --> <property name="hibernate.show_sql">true <property name="hibernate.format_sql">true ...
打开server项目下的hibernate.properties 文件,修改Hibernate数据库方言的配置(hibernate.dialect)为项目选用的数据库类型,如果采用是mysql 5.0数据库,设置为org.hibernate.dialect.MySQLDialect, 如果采用oracle...
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect <prop key="current_session_context_class">thread <prop key="hibernate.show_sql">true <prop key="hibernate.format_sql">...
Hibernate配置各种数据源 <hibernate-configuration> <!– 各属性的配置–> <!—为true表示将Hibernate发送给数据库的sql显示出来 –> ”show_sql”>true <!– SQL方言,这边设定的是MySQL –> ”dialect”>...
<property name="dialect">org.hibernate.dialect.MySQLDialect <!-- Echo all executed SQL to stdout --> <property name="show_sql">true <!-- Drop and re-create the database schema on startup --> ...
HibernateD 是 D 语言的 ORM 框架,类似 Java 的 Hibernate,示例代码:import hibernated.core; // Annotations of entity classes class User { long id; string name; Customer customer; @...