2009-09-22 7 views
19

Comment puis-je obtenir Hibernate (en utilisant JPA) pour créer des tables MySQL InnoDB (au lieu de MyISAM)? J'ai trouvé des solutions qui fonctionneront en utilisant Hibernate pour générer un fichier SQL pour créer les tables, mais rien qui fonctionne "à la volée".Hibernate: Créer des tables MySQL InnoDB au lieu de MyISAM

+0

Voulez-vous dire en utilisant les paramètres de configuration de hbm2ddl? – skaffman

+0

Oui. Apparemment, définir 'delimiter = type = InnoDB' fonctionne uniquement pour la sortie du script. Je l'ai essayé avec 'hibernate.hbm2ddl.auto = create' et j'ai obtenu des tables MyISAM. –

+0

Créé un jira pour cela: [HHH-8050] (https://hibernate.onjira.com/browse/HHH-8050) –

Répondre

28

Ne peut pas vous indiquer le dialecte Hibernate et utiliser org.hibernate.dialect.MySQLInnoDBDialect

+0

Cela a fait le travail! Merci! –

+7

Notez que cette réponse est maintenant obsolète. L'approche actuellement proposée consiste à utiliser la propriété 'hibernate.dialect.storage_engine = innodb'. Voir http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ – Jules

9

Vous spécifiez le paramètre dialecte dans votre configuration de mise en veille prolongée? Si ce n'est pas le cas, 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 donner un dialecte spécifique, en ajoutant ceci à vos propriétés de mise en veille prolongée:

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 
+0

Oui, nous avions l'ensemble MySQL5Dialect. Merci pour le conseil! –

1

Je tentais d'utiliser hibernate4 avec Spring 3.2 et l'envelopper dans JPA. J'ai fini par créer ma propre classe .... J'ai copié tout le contenu de org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter dans mon propre fichier de classe et j'ai modifié la sortie d'un sous-programme pour changer le dialecte MySQL. MySQL5InnoDBDialect. Je suppose que j'aurais pu prolonger la classe.

... Quoi qu'il en soit

Modifié par:

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 pourriez penser que c'est un 'hack', mais je suppose que cela fonctionnera. Dans la configuration de 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> 

Alors ma classe est utilisée pour le haricot adaptateur « base de données ». (Pas de balayage des composants, mes cours sont répertoriés dans META-INF/persistence.xml (l'emplacement par défaut))

0

Oh boy .... désolé les gars ... plus googler donne un autre résultat de la 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> 

Ainsi, vous n'avez pas besoin d'étendre ou de modifier une classe ... vous devriez avoir lu le code source original de l'original HibernateJpaVendorAdapter un peu plus avant de répondre. Cela m'a cloué dans la propriété "databasePlatform" ...

0

Avec le printemps-démarrage 2.0.0M7 suivante ne fonctionnait pour moi (mysqld 5,7)

spring.jpa.hibernate.use-new-id-generator-mappings: true 
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect 
Questions connexes