2010-12-16 2 views
6

Hibernateはデータベースに依存しません。したがって、アプリケーションで使用するデータベースが何であれ、そのデータベースに関連するの方言を設定する必要があります。例についてはHibernateの方言

、我々はMySQLデータベースを使用していると仮定し、その後、我々は方言を下回る必要があります。 org.hibernate.dialect.MySQLDialect

が、我々は方言を下回る必要がある、我々はSQL Serverデータベースを使用しているとします org.hibernate .dialect.SQLServerDialect

Hibernateは、そのデータベースに関連する適切なクエリを生成します。 私の質問は、どのようなメカニズムがデータベースに基づいてクエリを生成するために休止状態で使用されたのですか?

答えて

9

ない私はあなたの質問を理解し、私は

まず:-)みます必ず他のものは、(何」のようないくつかのデータベースに特異的でありながら、は、すべてのデータベースで動作いくつかのものがあります現在の日付と時刻? ")。すべてのデータベースで動作するものについては、実際には方言に特有のものは何もありません。

しかし、データベースごとに異なる可能性があるすべての部分について、Hibernateは方言を使用します。 Dialectは、Hibernateがその言語でデータベースと通信するための「ヘルパー」です。たとえば、ある時点で、HibernateコードはJDBCの型 "Types.TIMESTAMP"のデータベースデータ型を知る必要があります。 Hibernateの "core"コードは、 "このdbのTypes.TIMESTAMPと同等のものを与えてください"と言っています。そして、特定のDialectがそれに答えます。

SQLの生成(または質問の生成)についても同じことが起こります。 Hibernateは基本構造を知っていますが、Dialectには「フィーチャXをサポートしていません」、または「フィーチャYに対しては、クエリに文字列 'abc'を使用する」というDialectが含まれています。

もちろん、私の答えはプロセス全体の極端な単純化です。私はDialect.javaとMySQLDialect.javaのコードを読むことをお勧めします。この情報の一部このように、あなたはどのようにHibernateの構造上のアイデアを持つことができます(そしてそれが消費にもどのように):

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.java

3

たちは休止状態にある方言休止状態で任意のクエリを使用する場合になりますデータベースの種類に関係なく、データベース固有のクエリに変換できます。 HibernateはHQLクエリをサポートしていますが、内部的にこれらのHQLクエリはネイティブなデータベースSQLコールに変換されます。

関連する問題