web-dev-qa-db-ja.com

HibernateのMariaDBダイアレクトクラス名は何ですか?

HibenateMariaDBを使用していますが、MariaDBの方言クラス名が見つかりませんでした。

Hibernateでは、MySQL5の方言の名前は

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

Oracle 10gの場合

<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

MariaDBの方言クラス名は何ですか?

16

ここで発表 のように、Hibernate ORM 5.2.8以降(2017年2月15日頃)、方言

org.hibernate.dialect.MariaDB53Dialect

そして

org.hibernate.dialect.MariaDBDialect

利用可能です。発表は、

MariaDBを使用している場合、MariaDBのバージョンを適切なHibernateダイアレクトと一致させる方がはるかに簡単なので、MariaDB固有のダイアレクトを使用するのが最善です。

21
l00tr

非常に短い答え

この執筆時点での現在の方言は次のとおりです。

  • org.hibernate.dialect。MariaDB102DialectMariaDBサーバー10.2
  • org.hibernate.dialect。MariaDB103DialectMariaDBサーバー10.3以降は、シーケンスのサポートを提供します。
  • org.hibernate.dialect。MariaDB10DialectMariaDBサーバー10.0および10.1
  • org.hibernate.dialect。MariaDB53DialectMariaDBサーバー5.3、およびそれ以降の5.xバージョン
  • org.hibernate.dialect。MariaDBDialectMariaDBサーバー5.1および5.2

短い答え

MariaDBサーバーを使用する場合、MySQLの方言ではなく、MariaDB Connector/JおよびMariaDB Hibernate方言を使用する必要があります。 MariaDBはドロップイン置換として作成されたものであり、それらのMySQLバージョンを使用すると基本的な機能が動作する可能性が高い場合でも、微妙な問題が発生したり、特定の機能が失われる可能性があります。

利用可能なMariaDB方言の完全なリストは、現在、Hibernateユーザーガイドではなく、 Hibernate JavaDoc に記載されています。 MariaDBサーバーのバージョンに応じて、対応する方言バージョンを選択する必要があります。この執筆時点での現在の方言は次のとおりです。

  • org.hibernate.dialect.MariaDB102Dialect for MariaDBサーバー10.2
  • mariaDBサーバー10.3以降のorg.hibernate.dialect.MariaDB103Dialectは、シーケンスのサポートを提供します。
  • mariaDBサーバー10.0および10.1のorg.hibernate.dialect.MariaDB10Dialect
  • mariaDBサーバー5.3以降の5.xバージョンのorg.hibernate.dialect.MariaDB53Dialect.
  • mariaDBサーバー5.1および5.2のorg.hibernate.dialect.MariaDBDialect.

詳細な使用情報については、方言のソースコードを調べる必要がある場合があることに注意してください。 (一部の方言ソースには、JavaDoc以外の使用情報のコメントがあります。)

MariaDBダイアレクトのストレージエンジンを変更したり、明示的に言及する場合は、storage_engine Hibernate変数を使用できます。例:hibernate.dialect.storage_engine = innodb。 IMOでは、これを明示的に行う必要があります。これは、異なるMariaDBサーバーバージョンに切り替えるとデフォルトが変更される可能性があるためです。

10.1.2より古いMariaDBサーバー(小数秒をサポートしない)を使用している場合、JDBC URLにパラメーターuseFractionalSeconds=falseを指定することができます。そうしないと、MariaDB Connector/Jはタイムスタンプを切り捨てません。内部的には、これらの値が比較クエリで使用されている場合に時間比較の問題を引き起こす可能性があります(プレーンJDBCを使用している場合でも)、Hibernateのバージョン管理の問題や一時型の楽観的ロックの問題を引き起こす可能性があります。

長い答え

HibernateのMariaDB方言(この記事の執筆時点で5.3)は Hibernate User Guide に記載されています。言及された方言「短い名前」とそれに続く注釈は次のとおりです。

  • MariaDB:MariadBデータベースのサポート。新しいバージョンで動作する可能性があります

  • MariaDB53:MariadBデータベース、バージョン5.3以降のサポート。

ただし、利用可能な公式のMariaDB方言の完全なリストは Hibernate JavaDoc にあります。現在リストされているもの:

  • org.hibernate.dialect.MariaDB102Dialect for MariaDBサーバー10.2
  • mariaDBサーバー10.3以降のorg.hibernate.dialect.MariaDB103Dialectは、シーケンスのサポートを提供します。
  • mariaDBサーバー10.0および10.1のorg.hibernate.dialect.MariaDB10Dialect
  • mariaDBサーバー5.3以降の5.xバージョンのorg.hibernate.dialect.MariaDB53Dialect.
  • mariaDBサーバー5.1および5.2のorg.hibernate.dialect.MariaDBDialect.

各方言の後継者は、以前の方言バージョンから設定を継承します。したがって、MariaDBの継承階層はMariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialectです。

MariaDBは、MySQLのドロップイン代替として設計されました。しかし、時間の経過とともにデータベースは分岐する可能性があります。ほとんどの基本的な機能はおそらく問題なく機能し、Connector/Jクライアント(MySQLサーバーのMariaDBクライアントとその逆)を交換でき、方言(MariaDBクライアントのMySQL方言とその逆)を交換できます。しかし、予期しない問題を引き起こす可能性のある微妙な違いがあります。たとえば、MySQL Connector/Jクライアントにはサーバーバージョンのハードコードチェックが含まれており、MariaDBサーバーを使用すると失敗し、MySQL sendFractionalSecondsクライアントパラメーターなどの一部の機能がクライアントで無効になります。これにより秒の小数部が無効になるため、MySQLクライアントでは小数部が切り捨てられますが、MariaDBクライアントでは切り捨てられません。 (これは、非最大精度のSQL日付/時刻型と組み合わせて日付/時刻型を使用してバージョン管理を使用する場合、楽観的なロックの問題につながる可能性があります。これらの場合、最大精度6を使用します。)

また、MariaDB方言は、MariaDBに特定の機能を提供することが期待されています。 http://in.relation.to/2017/02/16/mariadb-dialects/

そのうち、MariaDBで導入された新しい機能に基づいて、新しい方言を追加します。

...

MariaDBを使用している場合、MariaDBのバージョンを適切なHibernateダイアレクトと一致させる方がはるかに簡単なので、MariaDB固有のダイアレクトを使用するのが最善です。

そして https://hibernate.atlassian.net/browse/HHH-11457 はこう言います:

mySQLとMariaDBは異なる方向に進んでいるので、MariaDBダイアレクトも提供したい場合があります。

たとえば、Hibernateユーザーにとって、MariaDB 5.3以降で利用可能なマイクロ秒の精度でタイムスタンプを処理するには、MySQLInnoDb57Dialectを使用する必要があることを理解することはあまり直感的ではありません。

Hibernate User Guideは、方言の使用方法に関するすべての使用情報を提供していません。ユーザーガイドとAPIドキュメントを組み合わせただけでは不十分な場合があります。使用情報については、ソースコードを調べる必要がある場合があります。たとえば、 MariaDB53Dialect.Java には、役に立つかもしれない非JavaDocの非表示コメントが含まれています。

以前は、MyISAMやInnoDBなどのMySQLストレージエンジンまたはデフォルトを選択するために、たとえばMySQL57InnoDBDialectMySQL57Dialectを切り替えることができました。しかし、彼らは Hibernateブログ投稿 で述べられているように、Hibernate 5.2.8からMySQL方言階層をリファクタリングしました。ストレージエンジンを選択するには、環境変数またはシステムプロパティhibernate.dialect.storage_engineを使用する必要があります。例:hibernate.dialect.storage_engine = innodb

XtraDBはMariaDB 10.1以前のデフォルトのMariaDBストレージエンジンでしたが、10.2以降はInnoDBです。そのため、Hibernateが選択するストレージエンジンを明示的に言及したい場合があるため、storage_engine変数を使用する必要があります。 storage_engine変数に関する情報(ユーザーガイドには記載されていません)は、 AvailableSettings.Java のソースにあります。

10.1.2より古いMariaDBサーバー(小数秒をサポートしない)を使用している場合、JDBC URLにパラメーターuseFractionalSeconds=falseを指定することができます。そうしないと、MariaDB Connector/Jはタイムスタンプを切り捨てません。内部的には、時間比較の問題が発生する可能性があり、Hibernateのバージョン管理の問題や一時的なタイプの楽観的ロックの問題が発生する可能性があります。

17
Devabc

MariaDBはmysqlと100%互換性があるため、Mysql5Dialectを使用する必要があります。

4
Jens

here から、「MySQLInnoDBDialectではなくMySQL5InnoDBDialectまたはMySQL57InnoDBDialectである必要がある」と述べられました。

完全なリストについては、 http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#database-dialect を参照してください

5.2.17で新しいMariaDB方言が追加されました。 [〜#〜] jira [〜#〜] および commit を参照

3
maximilianus