Hibernate:创建MySQL InnoDB表而不是MyISAM

58

我该如何让Hibernate(使用JPA)创建MySQL InnoDB表(而不是MyISAM)?我找到了一些解决方案,可以在使用Hibernate生成SQL文件来创建表时运行,但没有任何可以“即时”工作的解决方案。


你的意思是使用hbm2ddl配置设置吗? - skaffman
是的。显然,仅在脚本输出中设置“delimiter=type=InnoDB”有效。我尝试了“hibernate.hbm2ddl.auto=create”,但得到的是MyISAM表。 - David Tinker
已为此创建了一个Jira:HHH-8050 - Ondra Žižka
11个回答

85

你不能指定Hibernate方言并使用吗?

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

编辑

从MySQL版本 > 5.1开始应该这样做:

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

为了避免遇到这个问题 在MySQL中使用"TYPE = InnoDB"会引发异常


28
请注意,这个答案现在已经过时。当前建议的方法是使用属性hibernate.dialect.storage_engine=innodb。请参阅http://in.relation.to/2017/02/20/mysql-dialect-refactoring/。 - Jules
Ajay Kumar的答案spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect对我很有用。 - KC Baltz
好的回答 +1。同样适用于Spring Boot 2.x。 - Anish B.
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 这个属性在我的应用程序配置文件中添加后有效。 - JassJava

36

请访问这个链接:

mysql-dialect-refactoring

它明确说明:

传统上,MySQL使用非事务性的MyISAM存储引擎,对于所有早于MySQL55Dialect的方言,默认存储引擎都是非事务性的MyISAM。从MySQL55Dialect开始,默认使用InnoDB存储引擎。

请将以下内容放入application.properties(或配置文件)中:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect

注意上面的第55条,而不只是第5条。

你也可以在控制台中看到它:

Hibernate: create table users_events (user_id bigint not null, event_id bigint not null) engine=InnoDB
Hibernate: create table users_roles (user_id bigint not null, role_id bigint not null) engine=InnoDB

希望能有所帮助。


针对MySQL和MariaDB,或者org.hibernate.dialect.MariaDB53Dialect。 - amxa

14

你在Hibernate配置中是否指定了方言设置?如果没有,Hibernate将尝试自动检测数据库方言,并选择最安全的MySQL方言,即MySQL 4 MyISAM。

您可以通过将以下内容添加到Hibernate属性中来指定特定的方言:

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

8
在 spring-boot 2.0.0M7 中,以下方法对我有效(mysqld 5.7)。
spring.jpa.hibernate.use-new-id-generator-mappings: true
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

8

5

对于更新版本,您可以使用

hibernate.dialect.storage_engine=innodb
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

hibernate.dialect 的其他选项可以是 MySQL55Dialect 或者 MySQL57Dialect

仅适用于 Spring Boot 2

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb

复制粘贴 > spring.jpa.properties.hibernate.dialect.storage_engine=innodb。在Spring Boot 2.1.3中无法工作,但另一个可以。 - Merv

2
如果您使用的是Hibernate 5.2.8+,请尝试使用MySQL55Dialect。根据Jules提供的链接,该方言默认将innoDB设置为存储引擎。请注意保留HTML标签。

1

我试图将Hibernate4与Spring 3.2一起使用,并将其包装在JPA中。

最终我创建了自己的类... 将org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter的整个内容复制到我的类文件中,并修改一个子程序的输出以将MySQL Dialect更改为MySQL5InnoDBDialect。我想我也可以扩展这个类。

无论如何...

修改后:

package com.imk.dao.hibernate;

public class HibernateJpaVendorAdapter extends AbstractJpaVendorAdapter {

[ snip snip snip --- use the original code ]

protected Class determineDatabaseDialectClass(Database database) {
    switch (database) {
    case DB2:
        return DB2Dialect.class;
    case DERBY:
        return DerbyDialect.class;
    case H2:
        return H2Dialect.class;
    case HSQL:
        return HSQLDialect.class;
    case INFORMIX:
        return InformixDialect.class;
    case MYSQL:
        return MySQL5InnoDBDialect.class;
    case ORACLE:
        return Oracle9iDialect.class;
    case POSTGRESQL:
        return PostgreSQLDialect.class;
    case SQL_SERVER:
        return SQLServerDialect.class;
    case SYBASE:
        return SybaseDialect.class;
    default:
        return null;
    }
}

}

你可能认为这是一种“黑客”方式,但我想它会起作用。在Spring上下文配置中,我添加了以下内容:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="MosJPA" />
    <property name="jpaVendorAdapter">
        <bean class="com.imk.dao.hibernate.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL" />
        </bean>
    </property>
</bean>

然后我的类被用于“数据库”适配器bean。(没有组件扫描,我的类在META-INF/persistence.xml中列出(默认位置))


1

如果您选择application.yml

spring:
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect

0

这是我在persistence.xml中解决问题的属性。您可以在Spring或直接在Hibernate中使用它们,无论您使用哪种开发堆栈:

        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
        <property name="hibernate.dialect.storage_engine" value="innodb"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接