Как я могу заставить Hibernate (используя JPA) создавать таблицы MySQL InnoDB (вместо MyISAM)? Я нашел решения, которые будут работать при использовании Hibernate для создания файла SQL для создания таблиц, но ничего не работает «на лету».
Спящий режим: создание таблиц Mysql InnoDB вместо MyISAM
Ответы (11)
Разве вы не можете указать диалект Hibernate и использовать
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
Изменить
Начиная с версии MySQL> 5.1 это должно быть
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
чтобы не столкнуться с этой проблемой Использование TYPE = InnoDB в MySQL вызывает исключение
hibernate.dialect.storage_engine=innodb
. См. in.relation.to/2017/02/20/mysql- диалектный рефакторинг
- person Jules; 26.05.2017
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
сработал для меня.
- person KC Baltz; 11.12.2019
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
Вышеупомянутое свойство сработало для меня, добавив в application.properties.
- person JassJava; 20.08.2020
Перейдите по этой ссылке:
Там ясно сказано:
Традиционно 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
Надеюсь, поможет.
Вы указываете настройку диалекта в конфигурации спящего режима? Если нет, то Hibernate попытается автоматически определить диалект базы данных и выберет самый безопасный диалект MySQL, то есть MySQL 4 MyISAM.
Вы можете дать ему определенный диалект, добавив его в свойства гибернации:
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
С 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
Начиная с Hibernate 5.2.8, классы Mysql*InnoDBDialect
, используемые другими ответами, устарели. Новое решение состоит в том, чтобы установить следующее свойство:
hibernate.dialect.storage_engine = innodb
См. http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ для более подробной информации.
Для более новых версий вы можете использовать
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
Если вы используете Hibernate 5.2.8+, попробуйте использовать MySQL55Dialect, который, согласно ссылке, предоставленной Жюлем, по умолчанию устанавливает innoDB в качестве механизма хранения.
Я пытался использовать 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 (расположение по умолчанию))
О, боже... извините, ребята... больше 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"...
если вы выберете application.yml
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
Вот свойства моего файла persistence.xml, которые это исправили. Вы можете использовать их в Spring или непосредственно в Hibernate, независимо от вашего стека разработки:
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.dialect.storage_engine" value="innodb"/>