![](/img/trans.png)
[英]How can I configure Hibernate 5 to force Mysql create tables using Innodb engine?
[英]Hibernate: Create Mysql InnoDB tables instead of MyISAM
如何让 Hibernate(使用 JPA)创建 MySQL InnoDB 表(而不是 MyISAM)? 我找到了在使用 Hibernate 生成 SQL 文件来创建表时有效的解决方案,但没有任何“即时”有效的解决方案。
你不能指定 Hibernate 方言并使用
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
编辑
从 MySQL 版本 > 5.1 这应该是
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
转到此链接:
它清楚地说:
传统上,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
希望能帮助到你。
您是否在休眠配置中指定方言设置? 如果没有,Hibernate 将尝试自动检测数据库方言,并选择最安全的 MySQL 方言,即 MySQL 4 MyISAM。
你可以给它一个特定的方言,通过将它添加到你的休眠属性中:
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
使用 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
从 Hibernate 5.2.8 开始,不推荐使用其他答案使用的Mysql*InnoDBDialect
类。 新的解决方案是设置以下属性:
hibernate.dialect.storage_engine = innodb
有关更多详细信息,请参阅http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ 。
对于较新的版本,您可以使用
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
如果您使用的是 Hibernate 5.2.8+,请尝试使用 MySQL55Dialect,根据 Jules 提供的链接,默认情况下将 innoDB 设置为存储引擎。
我试图在 Spring 3.2 中使用 hibernate4 并将其包装在 JPA 中。
我最终创建了自己的类....将 org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter 的全部内容复制到我自己的类文件中,并修改了一个子程序的输出以将 MySQL 方言更改为 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(默认位置)中列出)
哦,男孩......对不起,伙计......更多谷歌搜索给出了另一个搜索结果:
<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”属性......
如果您选择 application.yml
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
这是我的persistence.xml 中修复它的属性。 您可以在 Spring 中或直接在 Hibernate 中使用它们,无论您的开发堆栈如何:
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.dialect.storage_engine" value="innodb"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.