Hibernateを使用してデータソースを構成する場合、hibernate.dialect
プロパティ(またはEclipseLinkを使用している場合はeclipselink.target-database
)を追加する必要があります。
dialect?の意味を知りたいHibernateのドキュメントに従ってこのプロパティを構成しますが、その意味はわかりません。
方言は「言語の変形」を意味します。 Hibernateは、ご存じのとおり、データベースに依存しません。さまざまなデータベースで機能します。ただし、データベースには独自の拡張機能/ネイティブSQLバリエーションがあり、SQL標準実装のセット/サブセットがあります。したがって、ある時点で、Hibernateはデータベース固有のSQLを使用する必要があります。 Hibernateは「方言」構成を使用して、使用しているデータベースを認識し、必要なときにいつでもデータベース固有のSQLジェネレーターコードに切り替えることができます。
「JDBCの皮肉は、プログラミングインターフェイスは移植可能ですが、SQL言語はそうではないということです。SQL言語を標準化しようとする多くの試みにもかかわらず、2つの主要なデータベースプラットフォームで変更なしで実行されるSQLを記述することはまだまれです。 SQLダイアレクトが類似している場合、各データベースはクエリの構造に応じて異なる動作をするため、ほとんどの場合、ベンダー固有のチューニングが必要です。」
..stolen fromPro JPA 2マスタリングJava Persistence API、第1章、9ページ
したがって、JDBCは、データベースに関連するすべてのものを抽象化する究極の仕様と考えるかもしれませんが、そうではありません。
JDBC仕様 、4.4章、20ページからの引用:
ドライバ層mayは、標準のSQL:2003構文とデータソースでサポートされているネイティブなダイアレクトの違いをマスクします。
5月は、ドライバーがを保証するものではないため、アプリケーションを機能させるために方言を提供する必要があります。最良のシナリオでは、アプリケーションは動作しますが、永続化プロバイダーが使用する方言を知っている場合ほど効率的に実行されない可能性があります。 Hibernateの場合、方言を与えない限り、彼はアプリケーションのデプロイを拒否します。
JDBC仕様では、Word JPQLについては言及していません。 JDBCは、データベースaccessの標準化された方法です。 このJavaDoc を読むと、アプリケーションがデータベースにアクセスできたら、JDBC準拠のドライバーにフィードする必要があるのはVanillaであることがわかります。 =装飾なし SQL。
JPQLはクエリ言語であり、データ定義言語(DDL)ではないことに注意してください。したがって、JDBCドライバーにJPQLを提供できたとしても、persistence.xml
ファイルの解析およびテーブルのセットアップの段階では、永続性プロバイダーにとっては役に立ちません。
参考までに、persistence.xmlファイルでJava DB方言を指定する方法に関するHibernateおよびEclipseLinkの例を以下に示します。
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/>
<property name="eclipselink.target-database" value="JavaDB"/>
理論的には、プロパティは標準化されておらず、 JPA 2.1仕様 はSQL方言に関するWordではないことを示しています。したがって、私たちは運が悪いので、ベンダー固有の実証研究とその文書化に頼らなければなりません。
Hibernateアーカイブをデプロイ不可にするプロパティを指定していないデプロイメントアーカイブの受け入れを拒否します。 Hibernate documentation 言う:
Hibernate.dialectプロパティを常にデータベースの正しいorg.hibernate.dialect.Dialectサブクラスに設定します。
それはかなり明確です。ドキュメントに記載されている方言は、特定のベンダーをターゲットにしていることに注意してください。 「一般的な」方言などはありません。プロパティーがデプロイメントを成功させるための絶対的な要件であることを考えると、HibernateをバンドルするWildFlyアプリケーションサーバーの documentation が何かを言うはずですが、そうではありません。
EclipseLinkはもう少し寛容です。プロパティを指定しない場合、デプロイメントがデプロイされます(警告も表示されません)。 EclipseLink documentation 言います:
Eclipselink.target-databaseプロパティを使用して、使用するデータベースを指定し、指定されたデータベースのカスタム操作とSQL生成を制御します。
話は「カスタム操作とSQL生成」についてであり、私に尋ねると少しあいまいです。しかし、1つはっきりしていることは、プロパティが必須であると言っていないことです。また、利用可能な値の1つが「汎用データベース」ターゲットを表す「データベース」であることに注意してください。うーん、それは何の「方言」でしょうか? SQL 2.0 ??しかし、この場合もプロパティは「方言」ではなく「ターゲットデータベース」と呼ばれるため、「データベース」はSQLがまったくないことを意味します(笑)。 EclipseLinkをバンドルするGlassFishサーバーに移動します。 ドキュメント (ページ「6-3」)言う:
オプションのeclipselink.target-databaseプロパティを指定して、データベースタイプが正しいことを保証できます。
そのため、GlassFishは、プロパティが「オプション」であり、追加された値は、私が実際にJava DBを使用している「保証」であると主張しています。
グーグルで見つけられるものなら何でもコピー&ペーストして、神に祈りましょう。
Hibernate.dialect
プロパティは、選択したデータベースに対して適切なSQLステートメントを生成するようHibernateに指示します。
利用可能な方言のリストはここにあります: http://javamanikandan.blogspot.in/2014/05/sql-dialects-in-hibernate.html
RDBMS Dialect
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect
方言は、データベースで使用されるSQL方言です。
SQLダイアレクトのリスト Hibernateの場合。
Hibernate.cfg.xmlで次のように提供します。
<hibernate-configuration>
<session-factory name="session-factory">
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
...
</session-factory>
</hibernate-configuration>
またはプロパティファイルで次のように:
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
簡潔な答え
hibernate.dialect
プロパティにより、Hibernateは選択したデータベースに適切なSQLステートメントを生成します。
Hibernateは「方言」構成を使用して、使用しているデータベースを認識し、Hibernateクエリをデータベース固有のクエリに変換できるようにします。
Hibernateコンテキストの方言は、データベースのデータ型を処理します。oraceでは整数ですが、SQLではintであるため、hibernateではこのプロパティによってフィールドを内部的にマップする方法が知られています。
データベースは、使用するSQL
にわずかな違いを実装します。たとえば、データ型などはデータベースによって異なります(たとえば、Oracleでは整数フィールドを数値フィールドに入れ、SQL Serverではintフィールドを使用します)。または、データベース固有の機能-上位n行の選択は、データベースによって異なります。方言はこれを抽象化するので、心配する必要はありません。
SQLダイアレクトは、Javaまたはその他のオブジェクト指向プログラムで記述するHQLクエリを特定のデータベースSQLに変換します。
たとえば、Javaでは、List employees = session.createQuery( "FROM Employee")。list();と書いたとします。
しかし私の方言が<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialectの場合
MySQLデータベースにアクセスする前に、HQL(「FROM Employee」)が「SELECT * FROM EMPLOYEE」に変換されます
方言は、特定の人々のグループが話す言語の形式です。
ここで、hibernateフレームワークのコンテキストで、hibernateが方言を使用するデータベースとtalk(クエリを使用)する場合。
SQLダイアレクトは、人間が読める式を使用してクエリステートメントを定義する構造化クエリ言語から派生しています。
Ahibernate dialectは、どのようにconvertクエリ(HQL)をネイティブSQLクエリに休止状態にします。
以下のプロパティを使用して、休止状態の方言を設定できます。
hibernate.dialect
ここ は、休止状態の方言の完全なリストです。
注:hibernateの方言プロパティはnot必須です。
方言プロパティは、次の方法でhibernateによって使用されます