2009-09-22 9 views
19

¿Cómo puedo obtener Hibernate (usando JPA) para crear tablas MySQL InnoDB (en lugar de MyISAM)? He encontrado soluciones que funcionarán cuando utilice Hibernate para generar un archivo SQL para crear las tablas, pero nada que funcione "sobre la marcha".Hibernate: Crear tablas Mysql InnoDB en lugar de MyISAM

+0

Qué quiere decir el uso de los ajustes de configuración hbm2ddl? – skaffman

+0

Sí. Al parecer, establecer 'delimiter = type = InnoDB' funciona solo para la salida del script. Lo intenté con 'hibernate.hbm2ddl.auto = create' y obtuve tablas MyISAM. –

+0

Creó una jira para esto: [HHH-8050] (https://hibernate.onjira.com/browse/HHH-8050) –

Respuesta

28

No se puede especificar que el dialecto de Hibernate y utilizar org.hibernate.dialect.MySQLInnoDBDialect

+0

¡Eso hizo el trabajo! ¡Gracias! –

+7

Tenga en cuenta que esta respuesta ahora está en desuso. El enfoque sugerido actual es usar la propiedad 'hibernate.dialect.storage_engine = innodb'. Consulte http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ – Jules

9

¿Está especificando la configuración dialecto en su configuración de hibernación? De lo contrario, Hibernate intentará detectar automáticamente el dialecto de la base de datos y seleccionará el dialec de MySQL más seguro, que es MySQL 4 MyISAM.

Se le puede dar un dialecto específico, añadiendo esto a sus propiedades de hibernación:

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

Sí, tuvimos el conjunto MySQL5Dialect. ¡Gracias por el consejo! –

1

yo estaba tratando de utilizar hibernate4 con Spring 3.2 y envolverlo en la APP.

que terminó la creación de mi propia clase .... copiado todo el contenido de la org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter en mi propio archivo de clase y modificar la salida de una subrutina para cambiar el dialecto MySQL a MySQL5InnoDBDialect. Creo que podría haber extendido la clase.

En fin ...

Modificada, tal como:

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; 
    } 
} 

} 

Usted podría pensar que esto es un 'hackear', pero, supongo que va a funcionar. En el contexto de configuración de la primavera, añadí:

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

Entonces mi clase se utiliza para la "base de datos" grano de adaptador. (Sin componente de exploración, mis clases se enumeran en META-INF/persistence.xml (la ubicación predeterminada))

0

Oh, muchacho .... lo siento chicos ... más googlear da otra búsqueda:

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

Por lo tanto, no necesita extender o cambiar una clase ... debería haber leído un poco más el código fuente original del HibernateJpaVendorAdapter original antes de responder. Eso me dio una pista en la propiedad "databasePlatform" ...

0

Con la primavera-arranque 2.0.0M7 siguiente me funcionó (mysqld 5,7)

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