Hybernateにデータベース方言の役割と利点と各種データベースの方言接続を配置する.

7855 ワード

Hybernate下層は依然としてSQL文を使用してデータベース動作を実行しています.すべての関係型データベースは標準SQL文の使用をサポートしていますが、すべてのデータベースは標準SQLをいくつか拡張していますので、文法的な詳細には若干の違いがあります.したがって、Hbernateはデータベースに基づいてこれらの違いを認識する必要があります.
たとえば、私たちはMySQLデータベースで改ページクエリを行います.limitキーワードを使えばいいです.標準SQLはlimitキーワードをサポートしていません.たとえばOracleは、行内ビューを使用して改ページする必要があります.同じアプリケーションでも、私たちが異なるデータベースの間を移動すると、底のデータベースへのアクセスの詳細が変わります.Hibernateもこのような変更のために準備しています.今必要なのは、Hbernateアプリケーションの下の階にどのデータベースが使われるかを教えています.これがデータベース方言です.
Hbernateのために適切なデータベース方言を設定すれば、Hbernateは自動的に底のデータベースへのアクセスにおける詳細な違いに対処することができます.
異なるデータベースで使用すべき方言は表5.1に示されています.
表異なるデータベースとその対応方言
リレーショナルデータベース
方言
DB 2
org.hibernate.dialect.DB 2 Dialect
DB 2 AS/400
org.hibernate.dialect.DB 2400 Dialect
DB 2 OS 390
org.hibernate.dialect.DB 2390 Dialect
PostgreSQL
org.hibernate.dialect.PostgreSQLDialect
MySQL
org.hibernate.dialect.MySQLDialect
MySQL with InnoDB
org.hibernate.dialect.MySQLInno DB Dialect
MySQL with MyISAM
org.hibernate.dialect.MySQLMyISAMDialect
Oracle(any version)
org.hibernate.dialect.OracleDialect
Oracle 9 i
org.hibernate.dialect.Oracle 9 iDialect
Oracle 10 g
org.hibernate.dialect.Oracle 10 gDialect
 
 
Syboase
org.hibernate.dialect.Syboase Dialect
Syboase Anywhere
org.hibernate.dialect.Syboase AnywhereDialect
Microsoft SQL Server
org.hibernate.dialect.SQLServerDialect
SAP DB
org.hibernate.dialect.SAPDBRICt
Informix
org.hibernate.dialect.InformixDialect
HypersonicSQL
org.hibernate.dialect.HSQLDialect
イングレー
org.hibernate.dialect.IngresDialect
Progess
org.hibernate.dialect.Progess Dialect
Mckoi SQL
org.hibernate.dialect.Mckoi Dialect
インターベース
org.hibernate.dialect.InterbaseDialect
Pointbase
org.hibernate.dialect.PointbaseDialect
フロンティアベース
org.hibernate.dialect.FrontbaseDialect
Firebird
org.hibernate.dialect.FirebirdDialect
もし一つのシステムが複数のデータベースで実行されたり、複数のデータベースを同時に使用したりすることができれば、ヒップホップを利用することは多くの便利をもたらします.Hybernate下層部は、dialectパッケージを通じて各種データベースの違いを抽象化しています.Dialectクラスではデータベースごとに同じものを実現しますが、異なるデータベース対応にはこのような拡張があります.最終的にはDialect Factoryによってどのクラスを作成するかを決定します.私たちは通常、ヒベルナツ.dialect属性を指定します.直接に該当するクラスを作成します.この属性が指定されていない場合は、ヒップホップ自身が適切な方言を選ぶことになります.Dialect Factoryでは各種データベース対応の方言のMapを初期化し、データベース製品名をkeyとし、方言の包装対象をvalueとする.Hibernateが方言を自動選択すると、JDBCのDatabaseMetadataでデータベースの製品名を取得し、名称に応じて方言を取得します.Dialect Factoryにおける当該Mapの初期化の部分コードは以下の通りである.
  • /TODO:this is the stuff it'd be nice to a properties file or some other easure user-editable
  • prvate static final Map MAPPERS=new HashMap()
  • static{
  • }
  • /detectors…
  • MAPPERS.put(「HSQL Database Engine」、new Version Insensitive Mapper)、
  • MAPPERS.put(「H 2」、new Version Insensitive Mapper)、
  • MAPPERS.put(「MySQL」、new Version Insensitive Mapper)、
  • MAPPERS.put(「PostgreSQL」、new Version Insensitive Mapper)、
  • MAPPERS.put(「Apache Derby」、new Version Insensitive Mapper)、
  • もともと、このような自動選択の方式は、私達に便利をもたらします.残念ながら、上記のコードの注釈から分かるように、現在の部分の初期化はハードコードによって行われています.後のバージョンだけが構成文や他のユーザーのコンパイルしやすいところに移動します.そうでないと、私達はとても簡単に追加できます.Hybernateで自動選択します.私たちがよく使うデータベースドライバの名前は上記のハードコードと違っていますので、最終的には自分でデータベースの方言を設定します.私たちのシステムではいくつかのデータソースを使っていますので、常に対応するタイプのデータベースです.データソースは容器から提供されます.最初の配置では、データベースの種類が変わったために、対応するデータベースの方言を変更することを忘れてしまい、問題が発生して、実施者に多くの不便をもたらしました.しかし、現在は各種のデータベースに上記のハードコードと同じデータベースの製品名のドライブプログラムを提供する以外に、自分で
  • を実行するしかないです.
  • ヒベルナタの各データベースへの接続方言
  •  
    <session-factory>
    
    <property name="connection.driver_class">net.sourceforge.jtds.JDBC.Driver</property>
    
    <property name="connection.url">jdbc:jtds:sqlserver://ALEX:1134/News</property>
    
    <!--for Oracle 9
    
    <property name="dialect">org.Hibernate.dialect.Oracle9Dialect</property>
    
    -->
    
    <!--for MySQL
    
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    
    -->
    
    <!--for Ms SQL Server-->
    
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    
    <property name="connection.username">sa</property>
    
    <property name="connection.password">sa</property>
    
    <property name="show_sql">true</property>
    
    </session-factory>
    
    
    
    ?
    
    
    
    
    
    <!--MySql      eg. mysql-connector-java-5.0.4-bin.jar-->
    
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    
    
    
    <!-- JDBC URL -->
    
    <property name="connection.url">jdbc:mysql://localhost/dbname?characterEncoding=gb2312</property>
    
    
    
    <!--       -->
    
    <property name="connection.username">root</property>
    
    
    
    <!--      -->
    
    <property name="connection.password">root</property>
    
    
    
    
    
    <!--Sql Server      eg. jtds-1.2.jar-->
    
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    
    <property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
    
    
    
    <!-- JDBC URL -->
    
    <property name="connection.url">jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname</property>
    
    
    
    <!--       -->
    
    <property name="connection.username">sa</property>
    
    
    
    <!--      -->
    
    <property name="connection.password"></property>
    
    
    
    
    
    
    
    <!--Oracle      ojdbc14.jar-->
    
    <property name="dialect">org.hibernate.dialect.OracleDialect</property>
    
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    
    
    
    <!-- JDBC URL -->
    
    <property name="connection.url">jdbc:oracle:thin:@localhost:1521:dbname</property>
    
    
    
    <!--       -->
    
    <property name="connection.username">test</property>
    
    
    
    <!--      -->
    
    <property name="connection.password">test</property>
    
    
    
    
    
    
    
            ,    Hibernate SQL   (hibernate.dialect)     。
    
    Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'last_insert_id'            。
    
    
    
    ?
    
    
    
    
    
    RDBMS    
    
    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