我该如何让Hibernate(使用JPA)创建MySQL InnoDB表(而不是MyISAM)?我找到了一些解决方案,可以在使用Hibernate生成SQL文件来创建表时运行,但没有任何可以“即时”工作的解决方案。
我该如何让Hibernate(使用JPA)创建MySQL InnoDB表(而不是MyISAM)?我找到了一些解决方案,可以在使用Hibernate生成SQL文件来创建表时运行,但没有任何可以“即时”工作的解决方案。
你不能指定Hibernate方言并使用吗?
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
编辑
从MySQL版本 > 5.1开始应该这样做:
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
为了避免遇到这个问题 在MySQL中使用"TYPE = InnoDB"会引发异常
hibernate.dialect.storage_engine=innodb
。请参阅http://in.relation.to/2017/02/20/mysql-dialect-refactoring/。 - Julesspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
对我很有用。 - KC Baltzspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
这个属性在我的应用程序配置文件中添加后有效。 - JassJava请访问这个链接:
它明确说明:
传统上,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
希望能有所帮助。
你在Hibernate配置中是否指定了方言设置?如果没有,Hibernate将尝试自动检测数据库方言,并选择最安全的MySQL方言,即MySQL 4 MyISAM。
您可以通过将以下内容添加到Hibernate属性中来指定特定的方言:
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.use-new-id-generator-mappings: true
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
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
我试图将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中列出(默认位置))
如果您选择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"/>