![](/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.