web-dev-qa-db-ja.com

データソースのSQLダイアレクトを構成する必要があるのはなぜですか?

Hibernateを使用してデータソースを構成する場合、hibernate.dialectプロパティ(またはEclipseLinkを使用している場合はeclipselink.target-database)を追加する必要があります。

dialect?の意味を知りたいHibernateのドキュメントに従ってこのプロパティを構成しますが、その意味はわかりません。

52
Captain Kidd

方言は「言語の変形」を意味します。 Hibernateは、ご存じのとおり、データベースに依存しません。さまざまなデータベースで機能します。ただし、データベースには独自の拡張機能/ネイティブSQLバリエーションがあり、SQL標準実装のセット/サブセットがあります。したがって、ある時点で、Hibernateはデータベース固有のSQLを使用する必要があります。 Hibernateは「方言」構成を使用して、使用しているデータベースを認識し、必要なときにいつでもデータベース固有のSQLジェネレーターコードに切り替えることができます。

90
RaviH

簡潔な答え

「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の場合、方言を与えない限り、彼はアプリケーションのデプロイを拒否します。

JPQL ではどうですか?

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を使用している「保証」であると主張しています。

結論

グーグルで見つけられるものなら何でもコピー&ペーストして、神に祈りましょう。

29

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
19
Mani

方言は、データベースで使用される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
5
K.C.

簡潔な答え

hibernate.dialectプロパティにより、Hibernateは選択したデータベースに適切なSQLステートメントを生成します。

5

Hibernateは「方言」構成を使用して、使用しているデータベースを認識し、Hibernateクエリをデータベース固有のクエリに変換できるようにします。

4
vishal thakur

Hibernateコンテキストの方言は、データベースのデータ型を処理します。oraceでは整数ですが、SQLではintであるため、hibernateではこのプロパティによってフィールドを内部的にマップする方法が知られています。

2

データベースは、使用するSQLにわずかな違いを実装します。たとえば、データ型などはデータベースによって異なります(たとえば、Oracleでは整数フィールドを数値フィールドに入れ、SQL Serverではintフィールドを使用します)。または、データベース固有の機能-上位n行の選択は、データベースによって異なります。方言はこれを抽象化するので、心配する必要はありません。

2

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」に変換されます

2
Sarita

方言は、特定の人々のグループが話す言語の形式です。

ここで、hibernateフレームワークのコンテキストで、hibernateが方言を使用するデータベースとtalk(クエリを使用)する場合。

SQLダイアレクトは、人間が読める式を使用してクエリステートメントを定義する構造化クエリ言語から派生しています。
Ahibernate dialectは、どのようにconvertクエリ(HQL)をネイティブSQLクエリに休止状態にします。

以下のプロパティを使用して、休止状態の方言を設定できます。

hibernate.dialect

ここ は、休止状態の方言の完全なリストです。

注:hibernateの方言プロパティはnot必須です。

1
Rohit Gaikwad

方言プロパティは、次の方法でhibernateによって使用されます

  1. 最適化されたSQLクエリを生成します。
  2. 複数のDBがある場合は、特定のDBとやり取りします。
  3. DBソフトウェアに基づいてHibernate構成ファイルのプロパティのデフォルト値を設定するには、構成ファイルで指定されていない場合でも使用します。
0
Praveen