Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

Edit

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

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

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

Ответ 2

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

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

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

Ответ 3

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

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

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

Ответ 4

С 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

Ответ 5

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

hibernate.dialect.storage_engine = innodb

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Я пытался использовать 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>

Затем мой класс используется для адаптера "database" bean. (без сканирования компонентов, мои классы перечислены в META-INF/persistence.xml(местоположение по умолчанию))

Ответ 9

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

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

Ответ 10

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

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