web-dev-qa-db-fra.com

Hibernate: Créez des tables Mysql InnoDB au lieu de MyISAM

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

37
David Tinker

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

45
Pascal Thivent

Aller à ce lien:

mysql-dialect-refactoring

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.

17
Ajay Kumar

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
12
skaffman

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
7
Oliver Sahner

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.

4
Jules

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.

2
OzzyTheGiant

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))

1
James Barwick

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
0
Yura Galavay

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

0
James Barwick