Hibernate:创建Mysql InnoDB表而不是MyISAM

时间:2009-09-22 10:23:54

标签: java mysql hibernate jpa innodb

如何让Hibernate(使用JPA)创建MySQL InnoDB表(而不是MyISAM)?我发现在使用Hibernate生成一个SQL文件来创建表时可以使用的解决方案,但没有任何“动态”工作。

11 个答案:

答案 0 :(得分:52)

你不能指定Hibernate方言并使用

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

修改

从MySQL版本> 5.1这应该是

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

避免遇到此问题Using "TYPE = InnoDB" in MySQL throws exception

答案 1 :(得分:19)

转到此链接:

mysql-dialect-refactoring

它清楚地说:

  

传统上,MySQL使用非事务性MyISAM存储引擎,这是所有比MySQL55Dialect更早的方言的默认存储引擎。从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

希望它有所帮助。

答案 2 :(得分:12)

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

你可以通过将它添加到你的hibernate属性中来给它一个特定的方言:

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

答案 3 :(得分:7)

使用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

答案 4 :(得分:4)

从Hibernate 5.2.8开始,不推荐使用其他答案使用的Mysql*InnoDBDialect类。新解决方案是设置以下属性:

hibernate.dialect.storage_engine = innodb

有关详细信息,请参阅http://in.relation.to/2017/02/20/mysql-dialect-refactoring/

答案 5 :(得分:2)

如果您使用的是Hibernate 5.2.8+,请尝试使用MySQL55Dialect,它根据Jules提供的链接,默认将innoDB设置为存储引擎。

答案 6 :(得分:2)

对于较新的版本,您可以使用

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

答案 7 :(得分:1)

我试图在Spring 3.2中使用hibernate4并将其包装在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(默认位置))

答案 8 :(得分:0)

哦,男孩......对不起伙计...更多Googling给出了另一个搜索结果:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="MosJPA" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </bean>
    </property>
</bean>

所以,你不需要扩展或更改类......在我回答之前,应该先阅读原始HibernateJpaVendorAdapter的原始源代码。这让我陷入了“databasePlatform”属性......

答案 9 :(得分:0)

如果您选择application.yml

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

答案 10 :(得分:0)

这是我的persistence.xml 中修复它的属性。您可以在 Spring 中或直接在 Hibernate 中使用它们,无论您的开发堆栈如何:

SELECT  users.login AS 'Все заказы' , items.title AS ' '  FROM `orders`
JOIN `items` ON orders.item_id  = items.id 
JOIN `users` ON users.id = orders.user_id