如何让Hibernate(使用JPA)创建MySQL InnoDB表(而不是MyISAM)?我发现在使用Hibernate生成一个SQL文件来创建表时可以使用的解决方案,但没有任何“动态”工作。
答案 0 :(得分:52)
你不能指定Hibernate方言并使用
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
修改强>
从MySQL版本> 5.1这应该是
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
答案 1 :(得分:19)
转到此链接:
它清楚地说:
传统上,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