67

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

方言の意味を知りたいです。Hibernate のドキュメントに従ってこのプロパティを設定しましたが、その意味がわかりません。

4

11 に答える 11

36

簡潔な答え

「JDBC の皮肉な点は、プログラミング インターフェイスは移植可能ですが、SQL 言語はそうではないということです。標準化しようとする多くの試みにもかかわらず、2 つの主要なデータベース プラットフォームでそのまま実行される複雑な SQL を記述することはまだまれです。 SQL ダイアレクトは似ていますが、クエリの構造によって各データベースのパフォーマンスが異なるため、ほとんどの場合、ベンダー固有のチューニングが必要です。」

.. Pro JPA 2 Mastering the Java Persistence API、第 1 章、9 ページから盗まれた

したがって、JDBC はデータベースに関連するすべてを抽象化する究極の仕様と考えるかもしれませんが、そうではありません。

JDBC 仕様、第 4.4 章、20 ページからの引用:

ドライバー レイヤー、標準の SQL:2003 構文とデータ ソースでサポートされているネイティブの方言との違いを隠す場合があります。

ドライバーが. _ 最良のシナリオでは、アプリケーションは動作しますが、持続性プロバイダーが使用するダイアレクトを認識している場合ほど効果的に動作しない可能性があります。Hibernate の場合、方言を与えない限り、彼はアプリケーションのデプロイを拒否します。

ではJPQLはどうでしょうか。

JDBC 仕様では、JPQL という言葉は言及されていません。JDBC は、データベースアクセスの標準化された方法です。この JavaDocを読むと、アプリケーションがデータベースにアクセスできるようになったら、JDBC 準拠のドライバーに入力する必要があるのは、vanilla = undecorated 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 方言について一言も述べていません。そのため、運が悪く、ベンダー固有の実証研究とそのドキュメントに目を向ける必要があります。

Hibernateは、アーカイブをデプロイ不能にするプロパティを指定していないデプロイメント アーカイブの受け入れを拒否します。Hibernate のドキュメントには次のように書かれています。

hibernate.dialect プロパティを常にデータベースの正しい org.hibernate.dialect.Dialect サブクラスに設定してください。

それはかなり明確です。ドキュメントに記載されているダイアレクトは、いずれかのベンダーを明確にターゲットにしていることに注意してください。「一般的な」方言などはありません。プロパティがデプロイを成功させるための絶対的な要件であることを考えると、Hibernate をバンドルする WildFly アプリケーション サーバーのドキュメントには何かが記載されているはずですが、そうではありません。

一方、 EclipseLinkはもう少し寛容です。プロパティを指定しない場合、デプロイは (警告もなしに) デプロイされます。EclipseLinkのドキュメントには次のように書かれています:

eclipselink.target-database プロパティを使用して、使用するデータベースを指定し、指定したデータベースのカスタム操作と SQL 生成を制御します。

話は「カスタム操作と SQL 生成」に関するもので、私に言わせれば少しあいまいです。しかし、1 つはっきりしていることは、プロパティが必須であるとは言っていないということです。また、使用可能な値の 1 つは、「汎用データベース」ターゲットを表す「Database」であることにも注意してください。うーん、それは何の「方言」でしょう?SQL2.0?? しかし、繰り返しになりますが、プロパティは「方言」ではなく「ターゲットデータベース」と呼ばれているため、「データベース」はまったくSQLに変換されない可能性があります笑。EclipseLink をバンドルする GlassFish サーバーに移ります。ドキュメント(ページ「6-3」)は次のように述べています。

オプションの eclipselink.target-database プロパティを指定して、データベース タイプが正しいことを保証できます。

したがって、GlassFish は、こ​​のプロパティは「オプション」であり、追加された値は、私が実際に Java DB を使用していることを「保証」するものであると主張しています。

結論

Google で見つけたものを何でもコピーして貼り付け、神に祈ります。

于 2014-06-27T21:47:42.873 に答える
25

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
于 2014-05-18T07:49:24.083 に答える
6

Dialect は、データベースが使用するSQL ダイアレクトです。

Hibernateの SQL ダイアレクトのリスト。

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
于 2014-01-09T06:10:39.307 に答える
5

簡潔な答え

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

于 2014-01-09T06:34:09.863 に答える
3

SQL ダイアレクトは、Java またはその他のオブジェクト指向プログラムで記述した HQL クエリを特定のデータベース SQL に変換します。

たとえば、Java で List employees = session.createQuery("FROM Employee").list(); と書いたとします。

しかし、私の方言が <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect の場合

HQL ("FROM Employee") は、MySQL データベースにアクセスする前に "SELECT * FROM EMPLOYEE" に変換されます。

于 2015-03-10T15:14:15.233 に答える
2

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

于 2015-11-29T09:54:24.540 に答える
2

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

于 2014-01-09T06:49:11.433 に答える
1

方言は、特定のグループの人々によって話される言語の形式です。

ここで、休止状態フレームワークのコンテキストでは、休止状態がデータベースと (クエリを使用して) 対話したい場合、方言を使用します。

SQL ダイアレクトは、人間が判読できる式を使用してクエリ ステートメントを定義する構造化クエリ言語から派生したものです。
休止状態の方言は、休止状態クエリ (HQL) をネイティブ SQL クエリ に変換する方法の情報をフレームワークに提供します。

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

hibernate.dialect

ここに、休止状態方言の完全なリストがあります。

注: hibernate のダイアレクト プロパティは必須ではありません。

于 2016-11-21T05:36:28.663 に答える