2017-11-08 8 views
1

私はSpringブート2.0.0.M6とSpring Data JPAを使用して新しいアプリケーションを開発しています。私はMariaDB v10を使用しています。 以下は私のdevのプロパティファイルです。Springブート2のMariaDBでInnoDBまたはXtraDBをストレージエンジンとして選択する方法JPAアプリケーション

spring.jpa.hibernate.ddl-auto=create-drop 
 
spring.datasource.url=jdbc:mariadb://localhost:3306/testdb 
 
spring.datasource.username=user 
 
spring.datasource.password= 
 
spring.jpa.show-sql=true 
 
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver 
 
org.hibernate.dialect.Dialect=MariaDB53Dialect 
 
spring.jooq.sql-dialect=MariaDB53Dialect

私は出力を得る:

Hibernate: create table hibernate_sequence (next_val bigint) engine=MyISAM

私はストレージエンジンを変更することはできませんよ。すべてのテーブルは、ストレージエンジンMyISAMを使用して作成されています。

他のストレージエンジンを使用して手動でテーブルを作成することができます。しかし何らかの理由で、SpringやHibernateはMyISAMエンジンにしかフォールバックしません。

純粋なHibernate-Javaアプリケーションでは、HibernateはデフォルトとしてInnoDBを使用します。

INFO: HHH000412: Hibernate Core {5.2.11.Final}

Hibernate: create table hibernate_sequence (next_val bigint) engine=InnoDB

Springブートプロパティからデータベースストレージエンジンを無効にする方法はありますか? Hibernateは5.2.12で

おかげ

+0

は確かですどちらの場合も同じ設定を使用していますか?恐らく、方言やストレージエンジン( 'hibernate.dialect.storage_engine')の設定が異なっているかもしれません。両方の[minimal examples](/ help/mcve)を提供できますか? –

+0

@AndyWilkinson私は 'hibernate.dialect.storage_engine = InnoDB'を使用しましたが、同じ結果が出ました。私は数時間でコードを投稿します。 – abcdef12

+0

@AndyWilkinson私は非常に単純なアプリケーション[インラインリンク](https://github.com/icewheel/springjpshibernatedemo.git)を投稿しました。それを実行し、ログを参照してください。私はデバッグしています。 – abcdef12

答えて

1

described in Spring Boot's documentationのように、プレフィックスがspring.jpa.propertiesであるすべてのプロパティは、接頭辞が削除された、基になるJPAプロバイダ(この場合はHibernate)に渡されます。

ダイアレクトを構成するHibernateプロパティはhibernate.dialectであり、その値は使用する方言の完全修飾クラス名である必要があります。この場合はorg.hibernate.dialect.MariaDB53Dialectです。一緒に上記を置く

、あなたはあなたのapplication.propertiesで次のプロパティを設定できます

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDB53Dialect 

これにより場所であなたの春ブーツベースのアプリケーションは、MariaDBの方言を使用しています。

2017-11-09 14:18:17.557 INFO 69955 --- [ost-startStop-1] org.hibernate.dialect.Dialect   : HHH000400: Using dialect: org.hibernate.dialect.MariaDB53Dialect 
+0

これは、現在の安定版Springで動作します。うわー、それはSpring Boot 2の正しい設定を選んだのですが、他のいくつかの問題があります...コードで見せてください。 – abcdef12

+0

Springブートv2.0.0.M6の場合エラーが発生しました: 'クエリメタデータへの接続を取得できませんでした。名前[MariaDB53Dialect]を戦略[org.hibernate.dialect.Dialect]'として解決できませんでした。私は 'spring.jpa.properties.hibernate.dialect = MariaDB53Dialect'というプロパティを使用して、変更を識別できるがエラーをスローします。 – abcdef12

+0

プロパティの値が間違っています。 'MariaDB53Dialect'だけでなく' org.hibernate.dialect.MariaDB53Dialect'が必要です。 –

0

、MariaDBに方言を設定しながら、私はMySQLStoredProcedureTestを実行する場合:

@RequiresDialect(MariaDB53Dialect.class) 
public class MySQLStoredProcedureTest 
     extends BaseEntityManagerFunctionalTestCase { 

    @Override 
    protected Class<?>[] getAnnotatedClasses() { 
     return new Class<?>[] { 
      Person.class, 
      Phone.class, 
     }; 
    } 

    ... 

} 

次のようにPostエンティティがマッピングされている:

@Entity 
public class Person { 

    @Id 
    @GeneratedValue 
    private Long id; 

    private String name; 

    private String nickName; 

    private String address; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date createdOn; 

    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL) 
    @OrderColumn(name = "order_id") 
    private List<Phone> phones = new ArrayList<>(); 

    @Version 
    private int version; 

    //Getters and setter omitted for brevity 
} 

そして、私がMariaDBでテストを実行すると、Hibernateは次のスキーマを生成します:

​​が InnoDBStorageEngine使用 MariaDBDialectを拡張しているためです
create table Person (
    id bigint not null, 
    address varchar(255), 
    createdOn datetime(6), 
    name varchar(255), 
    nickName varchar(255), 
    version integer not null, 
    primary key (id) 
) engine=InnoDB 

public class MariaDBDialect extends MySQL5Dialect { 
    public MariaDBDialect() { 
     super(); 
    } 

    public boolean supportsRowValueConstructorSyntaxInInList() { 
     return true; 
    } 

    @Override 
    protected MySQLStorageEngine getDefaultMySQLStorageEngine() { 
     return InnoDBStorageEngine.INSTANCE; 
    } 
} 

をので、それはhbm2ddlでスキーマを生成するとき​​でのMyISAMを取得することは不可能です。

ただし、hbm2ddlを使用して初期スクリプトを生成する必要があります。運用環境では、ツールlike FlywayDBを使用する必要があります。

Although the automatic schema generation is very useful for testing and prototyping purposes, in a production environment, it’s much more flexible to manage the schema using incremental migration scripts.

我々はchanged this in Hibernate 5.2.8ので、私はあなたの代わりに、古いバージョンを使用していると仮定し、そうでない場合、あなたはhbm2ddl自動でMyISAMテーブルを参照してくださいね、なぜ何の説明もありません:

私たちは、実際にHibernate User Guideでこれを書きました生成されたスキーマ。

使用して依存関係を確認してください:

mvn dependency:tree 

とあなたが本当に休止5.2.12を使用していることを確認してください。

+0

それはアプリケーションが使用する方言がMariaDB53Dialectではないという問題です。デフォルトではMySqlを使用していますが、Springのどこかでそれが起こっています。私はプロパティを使ってオーバーライドしようとしましたが、それは起こりません。 – abcdef12

+0

私はSpring Bootを使用しており、自動的に最高のHibernateバージョンを選択します。 – abcdef12

+0

Springブートv2.0.0.M6は、Hibernate 5.2.12.Finalを使用します。 – abcdef12

関連する問題