(MyISAMの代わりに)Hibernateで(JPAを使用して)MySQL InnoDBテーブルを作成するにはどうすればよいですか? Hibernateを使用してSQLファイルを生成し、テーブルを作成するときに機能するソリューションを見つけましたが、「オンザフライ」で機能するものはありません。
Hibernateダイアレクトを指定して使用できない
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
編集
MySQLバージョン> 5.1以降、これは
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
この問題の発生を回避するには MySQLで「TYPE = InnoDB」を使用すると例外がスローされます
このリンクに移動します。
それははっきり言っています:
従来、MySQLは非トランザクションのMyISAMストレージエンジンを使用していましたが、これはMySQL55Dialectより古いすべての方言のデフォルトのストレージエンジンです。 MySQL55Dialect以降、デフォルトでInnoDBストレージエンジンが使用されます。
Application.properties(またはconfig)に以下を追加します。
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
上記の55に注意してください。 -5つだけじゃない.
また、コンソールでも確認できます。
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
それが役に立てば幸い。
Hibernate構成で方言設定を指定していますか?そうでない場合、Hibernateはデータベースの方言を自動検出しようとし、MySQL 4 MyISAMである最も安全なMySQLの方言を選択します。
これをhibernateプロパティに追加することで、特定の方言を指定できます。
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
Spring-boot 2.0.0M7では、次は動作しました(mysqld 5.7)
spring.jpa.hibernate.use-new-id-generator-mappings: true
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
Hibernate 5.2.8以降、Mysql*InnoDBDialect
他の回答で使用されているクラスは非推奨です。新しい解決策は、次のプロパティを設定することです。
hibernate.dialect.storage_engine = innodb
詳細は http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ を参照してください。
新しいバージョンでは、
hibernate.dialect.storage_engine=innodb
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.dialectの他のオプションはMySQL55DialectまたはMySQL57Dialectのいずれかです。
Spring Boot 2の場合にのみ
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
Hibernate 5.2.8以降を使用している場合は、MySQL55Dialectを使用してみてください。MySQL55Dialectは、Julesによって提供されたリンクに従い、デフォルトでストレージエンジンとしてinnoDBを設定します。
私はhibernate4をSpring 3.2で使用してJPAでラップしようとしていました。
自分のクラスを作成してしまいました... org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapterの内容全体を自分のクラスファイルにコピーし、1つのサブルーチンの出力を変更して、MySQLダイアレクトをMySQL5InnoDBDialectに変更しました。クラスを延長できたと思います。
とにかく...
次のように変更:
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;
}
}
}
これは「ハック」だと思うかもしれませんが、うまくいくと思います。 Springコンテキスト構成で、私は追加しました:
<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>
次に、「データベース」アダプターBeanにクラスを使用します。 (コンポーネントのスキャンはありません。私のクラスはMETA-INF/persistence.xml(デフォルトの場所)にリストされています)
ああ、男の子....ごめんなさい... moreグーグルは別の検索結果を出します:
<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>
したがって、クラスを拡張または変更する必要はありません...答える前に、元のHibernateJpaVendorAdapterの元のソースコードをもう少し読む必要があります。それで、「databasePlatform」プロパティがわかりました...
application.ymlを選択した場合
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect