Спящий режим: создание таблиц Mysql InnoDB вместо MyISAM

Как я могу заставить Hibernate (используя JPA) создавать таблицы MySQL InnoDB (вместо MyISAM)? Я нашел решения, которые будут работать при использовании Hibernate для создания файла SQL для создания таблиц, но ничего не работает «на лету».


person David Tinker    schedule 22.09.2009    source источник
comment
Вы имеете в виду использование настроек конфигурации hbm2ddl?   -  person skaffman    schedule 22.09.2009
comment
да. По-видимому, установка «delimiter=type=InnoDB» работает только для вывода скрипта. Я попробовал это с помощью «hibernate.hbm2ddl.auto=create» и получил таблицы MyISAM.   -  person David Tinker    schedule 22.09.2009
comment
Для этого создал jira: HHH-8050   -  person Ondra Žižka    schedule 05.03.2013


Ответы (11)


Разве вы не можете указать диалект Hibernate и использовать

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

Изменить

Начиная с версии MySQL> 5.1 это должно быть

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

чтобы не столкнуться с этой проблемой Использование TYPE = InnoDB в MySQL вызывает исключение

person Pascal Thivent    schedule 22.09.2009
comment
Обратите внимание, что этот ответ устарел. Текущий предлагаемый подход заключается в использовании свойства hibernate.dialect.storage_engine=innodb. См. in.relation.to/2017/02/20/mysql- диалектный рефакторинг - person Jules; 26.05.2017
comment
Ответ Аджая Кумара на spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect сработал для меня. - person KC Baltz; 11.12.2019
comment
Хороший ответ +1. Работает и для Spring Boot 2.x. - person Anish B.; 23.07.2020
comment
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect Вышеупомянутое свойство сработало для меня, добавив в application.properties. - person JassJava; 20.08.2020

Перейдите по этой ссылке:

mysql-dialect-refactoring

Там ясно сказано:

Традиционно 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

Надеюсь, поможет.

person Ajay Kumar    schedule 30.04.2018
comment
Для MySQL — MariaDB. Или org.hibernate.dialect.MariaDB53Dialect - person amxa; 29.03.2019

Вы указываете настройку диалекта в конфигурации спящего режима? Если нет, то Hibernate попытается автоматически определить диалект базы данных и выберет самый безопасный диалект MySQL, то есть MySQL 4 MyISAM.

Вы можете дать ему определенный диалект, добавив его в свойства гибернации:

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
person skaffman    schedule 22.09.2009

С 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
person Oliver Sahner    schedule 24.01.2018

Начиная с Hibernate 5.2.8, классы Mysql*InnoDBDialect, используемые другими ответами, устарели. Новое решение состоит в том, чтобы установить следующее свойство:

hibernate.dialect.storage_engine = innodb

См. http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ для более подробной информации.

person Jules    schedule 26.05.2017

Для более новых версий вы можете использовать

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
person Yura Galavay    schedule 13.02.2019
comment
скопировано › spring.jpa.properties.hibernate.dialect.storage_engine=innodb. Не работает с весенней загрузкой 2.1.3. Но другой работает. - person Merv; 05.03.2019

Если вы используете Hibernate 5.2.8+, попробуйте использовать MySQL55Dialect, который, согласно ссылке, предоставленной Жюлем, по умолчанию устанавливает innoDB в качестве механизма хранения.

person OzzyTheGiant    schedule 24.04.2018

Я пытался использовать hibernate4 с Spring 3.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 (расположение по умолчанию))

person James Barwick    schedule 23.08.2013

О, боже... извините, ребята... больше Google дает другой результат поиска:

<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"...

person James Barwick    schedule 23.08.2013

если вы выберете application.yml

spring:
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
person SalutonMondo    schedule 23.08.2019

Вот свойства моего файла persistence.xml, которые это исправили. Вы можете использовать их в Spring или непосредственно в Hibernate, независимо от вашего стека разработки:

        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
        <property name="hibernate.dialect.storage_engine" value="innodb"/>
person Slava Imeshev    schedule 24.03.2021