web-dev-qa-db-ja.com

Hibernate:MyISAMの代わりにMysql InnoDBテーブルを作成する

(MyISAMの代わりに)Hibernateで(JPAを使用して)MySQL InnoDBテーブルを作成するにはどうすればよいですか? Hibernateを使用してSQLファイルを生成し、テーブルを作成するときに機能するソリューションを見つけましたが、「オンザフライ」で機能するものはありません。

44
David Tinker

Hibernateダイアレクトを指定して使用できない

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

編集

MySQLバージョン> 5.1以降、これは

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

この問題の発生を回避するには MySQLで「TYPE = InnoDB」を使用すると例外がスローされます

58
Pascal Thivent

このリンクに移動します。

mysql-dialect-refactoring

それははっきり言っています:

従来、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

それが役に立てば幸い。

23
Ajay Kumar

Hibernate構成で方言設定を指定していますか?そうでない場合、Hibernateはデータベースの方言を自動検出しようとし、MySQL 4 MyISAMである最も安全なMySQLの方言を選択します。

これをhibernateプロパティに追加することで、特定の方言を指定できます。

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
12
skaffman

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

Hibernate 5.2.8以降、Mysql*InnoDBDialect他の回答で使用されているクラスは非推奨です。新しい解決策は、次のプロパティを設定することです。

hibernate.dialect.storage_engine = innodb

詳細は http://in.relation.to/2017/02/20/mysql-dialect-refactoring/ を参照してください。

4
Jules

新しいバージョンでは、

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
2
Yura Galavay

Hibernate 5.2.8以降を使用している場合は、MySQL55Dialectを使用してみてください。MySQL55Dialectは、Julesによって提供されたリンクに従い、デフォルトでストレージエンジンとしてinnoDBを設定します。

2
OzzyTheGiant

私は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(デフォルトの場所)にリストされています)

1
James Barwick

ああ、男の子....ごめんなさい... 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」プロパティがわかりました...

0
James Barwick

application.ymlを選択した場合

spring:
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
0
SalutonMondo