25.3. 方言の解決

当初、Hibernate ではユーザーが使用する方言を指定する必要がありました。これは、 独自のビルドで複数のデータベースを同時にターゲットしたいユーザーにとって、問題となることがありました。通常、 ユーザーは Hibernate の方言を設定するか、値を設定する独自のメソッドを定義する必要がありました。
バージョン 3.2 より、 データベースへの java.sql.Connection より取得した java.sql.DatabaseMetaData を基に、 自動的に使用する方言を検出する概念が Hibernate に導入されました。 この解決方法は以前のものよりもはるかに優れていますが、 事前に Hibernate が認識するデータベースに限定され、 設定やオーバーライドができませんでした。
バージョン 3.3 以降の Hibernate は、一連のデリゲートに依存することにより、はるかに強力な方法でどの方言を使用すべきか自動的に判断します。このデリゲートは、メソッド 1 つのみを定義する org.hibernate.dialect.resolver.DialectResolver 実装しています。
public Dialect resolveDialect(DatabaseMetaData metaData) throws JDBCConnectionException
ここでの基本的なコントラクトでは、リゾルバがデータベースのメタデータを「理解」する場合は該当の方言を返し、「理解」しない場合は null を返して次のリゾルバに処理が継続されるます。また、この署名はスローされる可能性がある org.hibernate.exception.JDBCConnectionException も特定します。この場合、JDBCConnectionException は「一時的でない」 (回復可能でない) 接続問題を示すよう解釈され、解決の試行を即座に停止するよう示すために使用されます。他の例外はすべて警告を引き起こし、次のリゾルバに継続されます。
ユーザーは、 Hibernate に含まれるリゾルバより先に処理されるカスタムのリゾルバを登録することもできます。 カスタムのリゾルバは状況によっては便利です。 例えば、 Hibernate に同梱されているリゾルバよりも簡単に方言の自動検出を統合することが可能です。 特定のデータベースが認識された時にカスタム方言を使用するよう指定することも可能です。 1 つまたは複数のリゾルバを登録するには、 「hibernate.dialect_resolvers」 設定を使用して、 登録したいリゾルバをコンマ、 タブ、 空白文字のいずれかで区切り指定します (org.hibernate.cfg.Environment 上の DIALECT_RESOLVERS 定数を確認してください)。