概述
作为一个成熟的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(),什么都不加!!遇到这种问题还是直接去官方文档中找答案吧,解释如下:
Dialect | Remarks |
---|---|
MySQL5 | Support for the MySQL database, version 5.x |
MySQL5InnoDB | Support for the MySQL database, version 5.x preferring the InnoDB storage engine whenexporting tables. |
MySQL57InnoDB | Support for the MySQL database, version 5.7 preferring the InnoDB storage engine whenexporting tables. May work with newer versions |
问题完美解决!!之前想MySQL的存储引擎是插件式的,感觉很厉害,但是代价是兼容性问题要考虑全面一些。
最后要吐槽这一下Hibernate,既然有这种问题为什么一点错误提示都没有?好歹也告诉我是哪里错了呀!
最后
以上就是兴奋铅笔为你收集整理的Hibernate结合MySQL数据库生成数据表失败分析的全部内容,希望文章能够帮你解决Hibernate结合MySQL数据库生成数据表失败分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复