Comment puis-je obtenir qu'Hibernate (utilisant JPA) crée des tables MySQL InnoDB (au lieu de MyISAM)? J'ai trouvé des solutions qui fonctionneraient avec Hibernate pour générer un fichier SQL afin de créer les tables, mais rien ne fonctionne "à la volée".
Ne pouvez-vous pas spécifier le dialecte Hibernate et l'utiliser?
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
Modifier
Depuis la version MySQL> 5.1, cela devrait être
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
éviter de rencontrer ce problème Utiliser "TYPE = InnoDB" dans MySQL lève une exception
Aller à ce lien:
Il dit clairement:
Traditionnellement, MySQL utilisait le moteur de stockage MyISAM non transactionnel. Il s'agit du moteur de stockage par défaut pour tous les dialectes antérieurs à MySQL55Dialect. À partir de MySQL55Dialect, le moteur de stockage InnoDB est utilisé par défaut.
Mettez ce qui suit dans votre application.properties (ou dans votre configuration):
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
Avis 55 ci-dessus. - pas seulement 5.
Et vous pouvez aussi le voir dans la console:
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
J'espère que ça aide.
Spécifiez-vous le paramètre de dialecte dans votre configuration de veille prolongée? Sinon, Hibernate tentera de détecter automatiquement le dialecte de la base de données et choisira le dialec MySQL le plus sûr, MySQL 4 MyISAM.
Vous pouvez lui donner un dialecte spécifique, en l'ajoutant à vos propriétés d'hibernation:
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
Avec spring-boot 2.0.0M7, les opérations suivantes ont fonctionné pour moi (mysqld 5.7)
spring.jpa.hibernate.use-new-id-generator-mappings: true
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
Depuis Hibernate 5.2.8, les classes Mysql*InnoDBDialect
utilisées par les autres réponses sont obsolètes. La nouvelle solution consiste à définir la propriété suivante:
hibernate.dialect.storage_engine = innodb
Voir http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ pour plus de détails.
Si vous utilisez Hibernate 5.2.8+, essayez d’utiliser MySQL55Dialect, qui, selon le lien fourni par Jules, définit par défaut innoDB comme moteur de stockage.
J'essayais d'utiliser hibernate4 avec Spring 3.2 et de l'envelopper dans JPA.
J'ai fini par créer ma propre classe .... j'ai copié tout le contenu du fichier org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter dans mon propre fichier de classe et modifié le résultat d'un sous-programme afin de modifier le dialecte MySQL en MySQL5InnoDBDialect. Je suppose que j'aurais pu prolonger la classe.
En tous cas...
Modifié comme:
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;
}
}
}
Vous pensez peut-être que c'est un «bidouillage», mais je suppose que cela fonctionnera. Dans la configuration du contexte Spring, j'ai ajouté:
<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>
Ensuite, ma classe est utilisée pour le bean adaptateur "base de données". (pas d'analyse de composant, mes classes sont listées dans META-INF/persistence.xml (l'emplacement par défaut))
Pour les versions plus récentes, vous pouvez utiliser
hibernate.dialect.storage_engine=innodb
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
Autres options pour hibernate.dialect peut être MySQL55Dialect ou MySQL57Dialect
Juste en cas de Spring Boot 2
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
Oh, mec .... désolé les gars ... plus Googling donne un autre résultat de recherche:
<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>
Donc, vous n'avez pas besoin d'étendre ou de changer une classe ... vous devriez avoir lu le code source original de HibernateJpaVendorAdapter un peu plus loin avant de répondre. Cela m'a conduit à la propriété "databasePlatform" ...