Как я могу получить Hibernate (используя JPA) для создания таблиц MySQL InnoDB (вместо MyISAM)? Я нашел решения, которые будут работать при использовании Hibernate для создания файла SQL для создания таблиц, но ничего не работает "на лету".
Спящий режим: создание таблиц Mysql InnoDB вместо MyISAM
Ответ 1
Вы не можете указать диалект Hibernate и использовать
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
Edit
Начиная с версии MySQL> 5.1 это должно быть
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
чтобы избежать этой проблемы используя " TYPE = InnoDB " в MySQL выдает исключение
Ответ 2
Перейти по этой ссылке:
Там четко сказано:
Традиционно в 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