我是靠谱客的博主 兴奋铅笔,最近开发中收集的这篇文章主要介绍Hibernate结合MySQL数据库生成数据表失败分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

作为一个成熟的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.MySQL5DialectMySQL5InnoDBDialect是继承自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,既然有这种问题为什么一点错误提示都没有?好歹也告诉我是哪里错了呀!

最后

以上就是兴奋铅笔为你收集整理的Hibernate结合MySQL数据库生成数据表失败分析的全部内容,希望文章能够帮你解决Hibernate结合MySQL数据库生成数据表失败分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部