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的代码如下:
这是基本的Hibernate启动代码,非常简单,没有任何问题。
查看连接MySQL数据库的配置,包括但不限于如下:
用户名和密码是否正确
主机和端口是否正确
方言dialect是否正确
之后查看MySQL 服务器的问题,包括但不限于下面:
服务器是否开启
用户是否有权限执行相关的操作
数据库服务器的是否已经到最大连接数,默认是100,查询如下:
但是经过检查上面各个方面,发现没有任何问题,每当到这个时候时候我都开始怀疑人生,甚至是怀疑数据库本身是不是有bug。既然和单独一方面没有关系,那么是程序和数据库的连接关系上出了问题,那就是MySQL的驱动问题,换了一个最新版本的数据库驱动,MySQL Connector 6.0.6,结果发现果然是会玩,竟然连MySQL的驱动类都改了,该版本的驱动名称是
结果发现问题解决了!!!这可以确定是存储引擎的问题了,使用
问题完美解决!!之前想MySQL的存储引擎是插件式的,感觉很厉害,但是代价是兼容性问题要考虑全面一些。
最后要吐槽这一下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 |
最后要吐槽这一下Hibernate,既然有这种问题为什么一点错误提示都没有?好歹也告诉我是哪里错了呀!
相关文章推荐
- 结合struts和hibernate谈J2EE架构的数据表示
- 结合struts和hibernate谈J2EE架构的数据表示
- 结合struts和hibernate谈J2EE架构的数据表示
- 结合struts和hibernate谈J2EE架构的数据表示
- jdbc与hibernate结合修改子表数据(jdbc删除、hibernate更新/添加)
- 结合struts和hibernate谈J2EE架构的数据表示[转载]
- 结合struts和hibernate谈J2EE架构的数据表示
- 结合struts和hibernate谈J2EE架构的数据表示
- 结合struts和hibernate谈J2EE架构的数据表示
- 结合struts和hibernate谈J2EE架构的数据表示
- 从linux中的mysql数据库提取数据直接生成txt文件。
- extremetable+hibernate实现分页 关于结合hibernate后台数据分页和eXtremeTable分页功能的使用
- javabean的妙用-eclipse结合hibernate插件、struts插件快速生成源代码(示例代码)
- 结合struts和hibernate谈J2EE架构的数据表示
- 生成分析报告,移除定时任务,删除历史数据
- 结合struts和hibernate谈J2EE架构的数据表示
- javabean的妙用-eclipse结合hibernate插件、struts插件快速生成源代码
- 结合struts和hibernate谈J2EE架构的数据表示
- 操作Word模板文件.dot 结合具体数据 生成Word文档 .doc
- 结合struts和hibernate谈J2EE架构的数据表示