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
Odpowiedz
nie można określić dialekt hibernacji i używać org.hibernate.dialect.MySQLInnoDBDialect
To wykonało zadanie! Dzięki! –
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
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
Tak, mieliśmy zestaw MySQL5Dialect. Dzięki za wskazówkę! –
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))
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" ...
Od czasów hibernacji 5.2.8 klasy Mysql*InnoDBDialect
używane przez inne odpowiedzi są przestarzałe. Nowe rozwiązanie jest ustawienie następującą właściwość:
hibernate.dialect.storage_engine = innodb
Zobacz http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ więcej szczegółów.
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
masz na myśli używając ustawień hbm2ddl config? – skaffman
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. –
Utworzono jirę dla tego: [HHH-8050] (https://hibernate.onjira.com/browse/HHH-8050) –