2009-09-22 11 views
19

Jak mogę uzyskać Hibernate (używając JPA) do tworzenia tabel MySQL InnoDB (zamiast MyISAM)? Znalazłem rozwiązania, które będą działać podczas używania Hibernate do generowania pliku SQL do tworzenia tabel, ale nic, co działa "w locie".Hibernate: Utwórz tabele Mysql InnoDB zamiast MyISAM

+0

masz na myśli używając ustawień hbm2ddl config? – skaffman

+0

Tak. Najwyraźniej ustawienie "delimiter = type = InnoDB" działa tylko dla wyjścia skryptu. Próbowałem go z "hibernate.hbm2ddl.auto = create" i otrzymałem tabele MyISAM. –

+0

Utworzono jirę dla tego: [HHH-8050] (https://hibernate.onjira.com/browse/HHH-8050) –

Odpowiedz

28

nie można określić dialekt hibernacji i używać org.hibernate.dialect.MySQLInnoDBDialect

+0

To wykonało zadanie! Dzięki! –

+7

Pamiętaj, że ta odpowiedź jest teraz przestarzała. Obecnym sugerowanym podejściem jest użycie właściwości 'hibernate.dialect.storage_engine = innodb'. Zobacz http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ – Jules

9

Czy określania ustawienia dialekt w konfiguracji hibernacji? Jeśli nie, to Hibernate spróbuje automatycznie wykryć dialekt bazy danych i wybierze najbezpieczniejszy dialekt MySQL, którym jest MyISAM MySQL 4.

Można nadać mu specyficzny dialekt, dodając to do swoich właściwości Hibernacja:

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

Tak, mieliśmy zestaw MySQL5Dialect. Dzięki za wskazówkę! –

1

starałem się używać hibernate4 z wiosny 3.2 i zawinąć go w JPA.

Skończyłem na tworzeniu własnej klasy ... skopiowałem całą zawartość org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter do mojego pliku klasy i zmodyfikowałem wyjście jednego podprogramu, aby zmienić Dialekt MySQL na MySQL5InnoDBDialect. Sądzę, że mogłem rozszerzyć klasę.

Zresztą ...

Modified jak:

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

} 

Można by pomyśleć, że jest to 'włamać', ale przypuszczam, że to będzie działać. W konfiguracji kontekstowej Spring dodano:

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

Następnie moja klasa jest używana dla komponentu bean "bazy danych". (Bez skanowania komponent, moje zajęcia są wymienione w META-INF/persistence.xml (domyślna lokalizacja))

0

Och, chłopcze .... przepraszam chłopaki ... więcej Googling daje inny wynik wyszukiwania:

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

Nie trzeba więc rozszerzać ani zmieniać klasy ... Powinienem przeczytać nieco wcześniej oryginalny kod źródłowy oryginalnego HibernateJpaVendorAdapter, zanim odpowiem. Wpadło mi to na właściwość "databasePlatform" ...

0

z spring-boot 2.0.0M7 następujące nie działa dla mnie (mysqld 5.7)

spring.jpa.hibernate.use-new-id-generator-mappings: true 
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect 
Powiązane problemy