【问题标题】:Hibernate: Create Mysql InnoDB tables instead of MyISAMHibernate:创建 Mysql InnoDB 表而不是 MyISAM
【发布时间】:2010-11-30 08:44:19
【问题描述】:

如何让 Hibernate(使用 JPA)创建 MySQL InnoDB 表(而不是 MyISAM)?我找到了在使用 Hibernate 生成 SQL 文件来创建表时可以使用的解决方案,但没有任何解决方案可以“即时”运行。

【问题讨论】:

  • 您的意思是使用 hbm2ddl 配置设置吗?
  • 是的。显然设置 'delimiter=type=InnoDB' 仅适用于脚本输出。我用 'hibernate.hbm2ddl.auto=create' 试了一下,得到了 MyISAM 表。
  • 为此创建了一个 jira:HHH-8050

标签: java mysql hibernate jpa innodb


【解决方案1】:

你不能指定Hibernate方言并使用

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

编辑

从 MySQL 版本 > 5.1 这应该是

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

为了避免遇到这个问题Using "TYPE = InnoDB" in MySQL throws exception

【讨论】:

  • 请注意,此答案现已弃用。当前建议的方法是使用属性hibernate.dialect.storage_engine=innodb。见in.relation.to/2017/02/20/mysql-dialect-refactoring
  • Ajay Kumar 对spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect 的回答对我有用。
  • 不错的答案+1。也适用于 Spring Boot 2.x。
  • spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 将上述属性添加到 application.properties 中对我有用。
【解决方案2】:

您是否在休眠配置中指定方言设置?如果不是,那么 Hibernate 将尝试自动检测数据库方言,并选择最安全的 MySQL 方言,即 MySQL 4 MyISAM。

你可以给它一个特定的方言,通过将它添加到你的休眠属性中:

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

【讨论】:

    【解决方案3】:

    我试图在 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 中列出(默认位置))

    【讨论】:

      【解决方案4】:

      哦,男孩......对不起,伙计们......更多谷歌搜索给出了另一个搜索结果:

      <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”属性...

      【讨论】:

        【解决方案5】:

        从 Hibernate 5.2.8 开始,其他答案使用的 Mysql*InnoDBDialect 类已弃用。新的解决方案是设置以下属性:

        hibernate.dialect.storage_engine = innodb
        

        更多详情请见http://in.relation.to/2017/02/20/mysql-dialect-refactoring/

        【讨论】:

          【解决方案6】:

          使用 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
          

          【讨论】:

            【解决方案7】:

            如果您使用的是Hibernate 5.2.8+,请尝试使用MySQL55Dialect,根据Jules提供的链接,默认设置innoDB为存储引擎。

            【讨论】:

              【解决方案8】:

              转到此链接:

              mysql-dialect-refactoring

              上面写的很清楚:

              传统上,MySQL 使用非事务性 MyISAM 存储引擎,这是所有早于 MySQL55Dialect 的 Dialects 的默认存储引擎。从 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
              

              希望对你有帮助。

              【讨论】:

              • 对于 MySQL 和 MariaDB。或 org.hibernate.dialect.MariaDB53Dialect
              【解决方案9】:

              对于较新的版本,您可以使用

              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
              

              【讨论】:

              • 复制粘贴> spring.jpa.properties.hibernate.dialect.storage_engine=innodb.不适用于 Spring Boot 2.1.3。但另一个有效。
              【解决方案10】:

              如果你选择 application.yml

              spring:
                jpa:
                  properties:
                    hibernate:
                      dialect: org.hibernate.dialect.MySQL5InnoDBDialect
              

              【讨论】:

                【解决方案11】:

                这是我的 persistence.xml 中修复它的属性。无论您的开发堆栈如何,您都可以在 Spring 中或直接在 Hibernate 中使用它们:

                        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
                        <property name="hibernate.dialect.storage_engine" value="innodb"/>
                

                【讨论】:

                  猜你喜欢
                  • 2012-09-28
                  • 2019-01-14
                  • 2011-05-14
                  • 2010-12-30
                  • 2012-01-13
                  • 1970-01-01
                  • 2011-09-17
                  • 2011-04-18
                  • 2012-03-01
                  相关资源
                  最近更新 更多