`

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

阅读更多

一步一步升级配置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

 

 

 

  • 大小: 23 KB
  • 大小: 30.4 KB
  • 大小: 12.5 KB
  • 大小: 9.3 KB
  • 大小: 39.5 KB
  • 大小: 25.4 KB
  • 大小: 27.6 KB
  • 大小: 21.1 KB
  • 大小: 7 KB
  • 大小: 9.1 KB
1
0
分享到:
评论

相关推荐

    Hibernate不同数据库的连接及SQL方言

    在上面的配置中,我们使用了org.hibernate.dialect.SQLServerDialect SQL方言来生成适合SQL Server数据库的SQL语句。 下面是Hibernate支持的不同数据库的SQL方言: * DB2:org.hibernate.dialect.DB2Dialect * DB2...

    Hibernate 配置各种数据库

    例如,对于 MySQL 数据库,我们可以使用 org.hibernate.dialect.MySQLDialect 方言;对于 Oracle 数据库,我们可以使用 org.hibernate.dialect.OracleDialect 方言。 在 Hibernate 中配置不同的数据库需要选择合适...

    数据库连接字符串

    MySQL org.hibernate.dialect.MySQLDialect MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect Oracle (any version) org....

    数据库方言大全.txt

    - **MyISAM**:`org.hibernate.dialect.MySQLMyISAMDialect`适用于使用MyISAM存储引擎的MySQL数据库。 #### PostgreSQL **PostgreSQL** 是一款强大的开源对象关系型数据库系统。它的方言是: - `org.hibernate....

    数据库JDBC连接.txt

    - `org.hibernate.dialect.MySQLDialect`:适用于较旧版本的MySQL。 - `org.hibernate.dialect.MySQLInnoDBDialect`:针对使用InnoDB存储引擎的MySQL。 - `org.hibernate.dialect.MySQLMyISAMDialect`:针对使用...

    hibernate.cfg.xml 配置 和数据库驱动

    &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect &lt;property name="hibernate.show_sql"&gt;true ``` 3. **SessionFactory配置**:SessionFactory是Hibernate的核心对象,负责创建Session,...

    hibernate.properties

    - **`hibernate.dialect`**: 设定为`net.sf.hibernate.dialect.MySQLDialect`,表示当前使用的是MySQL数据库。 - **`hibernate.connection.driver_class`**: 驱动类设为`com.mysql.jdbc.Driver`。 - **`hibernate....

    Hibernate_session_factory_配置.docx

    - `dialect`:设置数据库方言,这里是`org.hibernate.dialect.MySQLDialect`,确保Hibernate能正确处理特定数据库的SQL语法。 3. **SQL日志**: - `show_sql`:如果设为true,Hibernate会在控制台打印执行的SQL...

    hibernate.properties详解

    - `hibernate.dialect`:根据需求选择不同的方言,如`MySQLDialect`、`MySQLInnoDBDialect`或`MySQLMyISAMDialect`。 - `hibernate.connection.driver_class`:数据库驱动类。 - `hibernate.connection.url`:...

    hibernate.cfg.xml文件详细解释

    例如,对于 MySQL 数据库,通常会使用 `org.hibernate.dialect.MySQLDialect`。 #### 四、总结 `hibernate.cfg.xml` 文件是 Hibernate 应用程序的重要组成部分,通过合理的配置可以极大提升应用的性能和稳定性。...

    SOY Framework框架Java RCP编程(一)--配置开发环境

    打开server项目下的hibernate.properties 文件,修改Hibernate数据库方言的配置(hibernate.dialect)为项目选用的数据库类型,如果采用是mysql 5.0数据库,设置为org.hibernate.dialect.MySQLDialect, 如果采用oracle...

    Hibernate.cfg.xml常用配置总结.docx

    正确配置方言可以让 Hibernate 使用最适合目标数据库的语法,例如,对于 MySQL 可能是 `org.hibernate.dialect.MySQLDialect`,对于 PostgreSQL 可能是 `org.hibernate.dialect.PostgreSQLDialect`。方言的正确选择...

    hibernate连接各种数据库的方法

    ### 使用Hibernate连接各种数据库的方法 #### 一、前言 Hibernate是Java开发中非常流行的ORM(对象关系映射)框架之一,它简化了数据库操作,让开发者能够更加专注于业务逻辑而不是复杂的SQL语句编写。本文将详细...

    简单配置hibernate

    2. `hibernate.dialect`:指定所使用的数据库方言,这里是 `net.sf.hibernate.dialect.MySQLDialect`,用于适配 MySQL 数据库。 3. `hibernate.connection.driver_class`:定义数据库驱动类,这里使用的是 `...

    Hibernate.cfg.xml常用配置总结.pdf

    5. **Hibernate.dialect**: 这个属性用于指定数据库的方言,让 Hibernate 能够生成适应特定数据库的 SQL 语句。例如,对于 MySQL,可以设置为 `org.hibernate.dialect.MySQLDialect`;对于 PostgreSQL,可以是 `org....

    hibernate于各大数据库的连接

    5. **dialect**: Hibernate方言,用于生成适应特定数据库的SQL语句,如`org.hibernate.dialect.MySQLDialect`。 ### 数据库连接池 为了提高性能,通常会使用数据库连接池,如C3P0、HikariCP或Apache DBCP。连接池...

    hibernate反向生成数据库表.doc

    &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect &lt;property name="hibernate.show_sql"&gt;true &lt;!-- Mapping files will be added here --&gt; &lt;/hibernate-configuration&gt; ``` 配置完成后...

    Hibernate 参数配置详解

    - **示例**:对于 MySQL 数据库,可以设置为 `org.hibernate.dialect.MySQLDialect`。 ##### 2. 显示 SQL 语句 (Show SQL) - **名称**:`hibernate.show_sql` - **描述**:启用该配置后,Hibernate 将在控制台上...

Global site tag (gtag.js) - Google Analytics