您的位置:首页 > 数据库 > MySQL

Hibernate结合MySQL数据库生成数据表失败分析

2017-03-23 21:38 316 查看
作为一个成熟的ORM框架,Hibernate对不同的数据库的支持可以说非常完美,但是在生成数据库的过程中还是会遇到各种各样的问题,今天在做数据表映射的时候,发现无法生成数据表,具体的开发环境如下:

Hibernate 5.2.3.Final

MySQL Windows 5.5.16

MySQL connector 5.1.39

发现这个问题之后,梳理一下思路,从以下几个方面查找问题:

首先查看自己的代码写的有没有问题,启动Hibernate的代码如下:

Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder(bsr).applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);


这是基本的Hibernate启动代码,非常简单,没有任何问题。

查看连接MySQL数据库的配置,包括但不限于如下:

用户名和密码是否正确

主机和端口是否正确

方言dialect是否正确

之后查看MySQL 服务器的问题,包括但不限于下面:

服务器是否开启

用户是否有权限执行相关的操作

数据库服务器的是否已经到最大连接数,默认是100,查询如下:

SHOW VARIABLES LIKE 'max_connections'


但是经过检查上面各个方面,发现没有任何问题,每当到这个时候时候我都开始怀疑人生,甚至是怀疑数据库本身是不是有bug。既然和单独一方面没有关系,那么是程序和数据库的连接关系上出了问题,那就是MySQL的驱动问题,换了一个最新版本的数据库驱动,MySQL Connector 6.0.6,结果发现果然是会玩,竟然连MySQL的驱动类都改了,该版本的驱动名称是
com.mysql.cj.jdbc.Driver
, 但是改完之后并没有神马用,此时身心俱疲,脑子开始胡思乱想,是不是连接数据库的驱动或者是方言和具体的存储引擎有关,因为之前看过姜承尧写的《InnoDB存储引擎》这本书,死马当活马医,查了一下,真的有
org.hibernate.dialect.MySQL5InnoDBDialect
这个方言,之前一直使用
org.hibernate.dialect.MySQL5Dialect
MySQL5InnoDBDialect
是继承自
MySQL5Dialect
,源码如下:

public class MySQL5InnoDBDialect extends MySQL5Dialect {
@Override
public boolean supportsCascadeDelete() {
return true;
}

@Override
public String getTableTypeString() {
return " ENGINE=InnoDB";
}

@Override
public boolean hasSelfReferentialForeignKeyBug() {
return true;
}
}


结果发现问题解决了!!!这可以确定是存储引擎的问题了,使用
org.hibernate.dialect.MySQL5InnoDBDialect
方言会在建表的DDL语句后面加上
ENGINE=InnoDB
,从源码上也能看出来,而org.hibernate.dialect.MySQL5Dialect是直接使用Dialect中的getTableTypeString(),什么都不加!!遇到这种问题还是直接去官方文档中找答案吧,解释如下:

DialectRemarks
MySQL5Support for the MySQL database, version 5.x
MySQL5InnoDBSupport for the MySQL database, version 5.x preferring the InnoDB storage engine whenexporting tables.
MySQL57InnoDBSupport for the MySQL database, version 5.7 preferring the InnoDB storage engine whenexporting tables. May work with newer versions
问题完美解决!!之前想MySQL的存储引擎是插件式的,感觉很厉害,但是代价是兼容性问题要考虑全面一些。

最后要吐槽这一下Hibernate,既然有这种问题为什么一点错误提示都没有?好歹也告诉我是哪里错了呀!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息