代码之家  ›  专栏  ›  技术社区  ›  David Tinker

休眠:创建mysql innodb表而不是myisam

  •  37
  • David Tinker  · 技术社区  · 16 年前

    如何让hibernate(使用jpa)创建mysql innodb表(而不是myisam)?我已经找到了在使用Hibernate生成SQL文件来创建表时可以工作的解决方案,但是“即时”工作的解决方案是无效的。

    9 回复  |  直到 7 年前
        1
  •  45
  •   Michael Lihs Paul Kenjora    8 年前

    不能指定Hibernate方言并使用

    hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
    

    编辑

    从MySQL 5.1版开始,应该是

    hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
    

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

        2
  •  17
  •   Ajay Kumar    8 年前

    转到此链接:

    mysql-dialect-refactoring

    它清楚地说:

    传统上,mysql使用非事务性myisam存储引擎,这是所有比mysql55方言旧的方言的默认存储引擎。从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
    

    希望它有帮助。

        3
  •  12
  •   skaffman    16 年前

    是否在休眠配置中指定方言设置?否则,Hibernate将尝试自动检测数据库方言,并选择最安全的mysql dialec,即mysql 4 myisam。

    通过将其添加到休眠属性中,可以为其指定特定的方言:

    hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
    
        4
  •  7
  •   Oliver Sahner    8 年前

    使用SpringBoot2.0.0m7后,我做了工作(mysqld 5.7)

    spring.jpa.hibernate.use-new-id-generator-mappings: true
    spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    
        5
  •  4
  •   Jules    9 年前

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

    hibernate.dialect.storage_engine = innodb
    

    http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ 了解更多详细信息。

        6
  •  2
  •   OzzyTheGiant    8 年前

    如果您使用的是Hibernate 5.2.8+,请尝试使用mysql55方言,根据jules提供的链接,该方言默认将innodb设置为存储引擎。

        7
  •  1
  •   James Barwick    12 年前

    我试着将Hibernate4与Spring3.2结合使用,并用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(默认位置)中列出)

        8
  •  0
  •   James Barwick    12 年前

    哦,伙计……对不起伙计们……更多的谷歌搜索会给出另一个搜索结果:

    <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
  •   Yura Galavay    7 年前

    对于较新版本,可以使用

    hibernate.dialect.storage_engine=innodb
    hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    

    其他选项 休眠.方言 可以是 MyQL55方言 MySQL L57方言

    以防弹簧套2

    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
    spring.jpa.properties.hibernate.dialect.storage_engine=innodb
    
    推荐文章