SpringBoot2 jpa创建innodb表

背景

        在使用springboot2 + jpa 的项目环境中,发现创建的表引擎都是MyISAM,如果是本地简单的单表测试当然没有问题,但是大家都知道MyISAM引擎是不支持事务的,这在实际的项目环境中是比较致命的,所以需要修改成InnoDB引擎。

查找解决方案

        第一时间当然是百度了(google党请轻喷),果然发现不少博客文章,直接使用博客方案:
将application.yml中添加如下配置

spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

重启应用,发现表仍然是MyISAM引擎。
既然无效,那么换个思路,看看博客的查找问题思路:
1.查找日志
发现如下启动日志:

2019-03-25 16:13:49,792:INFO main (Dialect.java:157) - HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect


        说明起决定作用的是这个dialect,那么只要将其修改为正确的值即可,打开类MySQL5InnoDBDialect,发现其实该类已经被标记为@Deprecated,那么一定是有了新的替代方案,查看其父类未找到关键点,再往上查找父类的父类MySQLDialect,关键代码如下:

String storageEngine = Environment.getProperties().getProperty("hibernate.dialect.storage_engine");
        if (storageEngine == null) {
            storageEngine = System.getProperty("hibernate.dialect.storage_engine");
        }

        if (storageEngine == null) {
            this.storageEngine = this.getDefaultMySQLStorageEngine();
        } else if ("innodb".equals(storageEngine.toLowerCase())) {
            this.storageEngine = InnoDBStorageEngine.INSTANCE;
        } else {
            if (!"myisam".equals(storageEngine.toLowerCase())) {
                throw new UnsupportedOperationException("The " + storageEngine + " storage engine is not supported!");
            }

            this.storageEngine = MyISAMStorageEngine.INSTANCE;
        }

        从这段代码可以看出MySQL默认的引擎为MyISAM,这就是我们在没有指定的情况下为MyISAM的原因了,既然是这样,那么我们直接看MySQLDialect有哪些实现类就ok了,


实现类.png

可以看到MySQL55Dialect这个实现类,打开该类:


MySQL55Dialect.png

由上图看到获取默认的引擎的实现方法返回的InnoDB,看到这里感觉离成功不远了,再看其子类,发现有MySQL57Dialect、MySQL8Dialect,很明显中间的55 57 指的是版本了,通过mysql -V指令查我们的MySQL版本为5.7,故使用如下配:
spring.jpa.database-platform: org.hibernate.dialect.MySQL57Dialect

验证

重启应用查看数据库表结构,发现创建的table已经是InnoDB引擎了。

你可能感兴趣的:(SpringBoot2 jpa创建innodb表)