Hibernate: создание MySQL таблиц InnoDB вместо MyISAM - PullRequest
41 голосов
/ 22 сентября 2009

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

Ответы [ 9 ]

52 голосов
/ 22 сентября 2009

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

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

Редактировать

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

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

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

19 голосов
/ 30 апреля 2018

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

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

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

12 голосов
/ 22 сентября 2009

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

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

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
7 голосов
/ 24 января 2018

При использовании 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
4 голосов
/ 26 мая 2017

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

hibernate.dialect.storage_engine = innodb

Подробнее см. http://in.relation.to/2017/02/20/mysql-dialect-refactoring/.

2 голосов
/ 13 февраля 2019

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

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
2 голосов
/ 24 апреля 2018

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

1 голос
/ 23 августа 2013

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

0 голосов
/ 23 августа 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» ...

...