簡體   English   中英

Hibernate:創建 Mysql InnoDB 表而不是 MyISAM

[英]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 中使用“TYPE = InnoDB”會引發異常

轉到此鏈接:

mysql-方言重構

它清楚地說:

傳統上,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 的其他選項可以是MySQL55DialectMySQL57Dialect

以防萬一 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM