Hibernate底層依然使用SQL語句來執行數據庫操作,雖然所有關係型數據庫都支持使用標準SQL語句,但所有數據庫都對標準SQL進行了一些擴展,所以在語法細節上存在一些差異,因此Hibernate需要根據數據庫來識別這些差異。
Hibernate底層依然使用SQL語句來執行數據庫操作,雖然所有關係型數據庫都支持使用標準SQL語句,但所有數據庫都對標準SQL進行了一些擴展,所以在語法細節上存在一些差異,因此Hibernate需要根據數據庫來識別這些差異。
舉例來說,我們在MySQL數據庫裏進行分頁查詢,只需使用limit關鍵字就可以了;而標準SQL並不支持limit關鍵字,例如Oracle則需要使用行內視圖的方式來進行分頁。同樣的應用程序,當我們在不同數據庫之間遷移時,底層數據庫的訪問細節會發生改變,而Hibernate也爲這種改變做好了準備,現在我們需要做的是:告訴Hibernate應用程序的底層即將使用哪種數據庫——這就是數據庫方言。
一旦我們爲Hibernate設置了合適的數據庫方言,Hibernate將可以自動應付底層數據庫訪問所存在的細節差異。
不同數據庫所應使用的方言如表5.1所示。
表 不同數據庫及其對應方言
關係數據庫 |
方 言 |
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 |
org.hibernate.dialect.Oracle9iDialect |
Oracle 10g |
org.hibernate.dialect.Oracle10gDialect |
|
|
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 |
- // TODO : this is the stuff it'd be nice to move to a properties file or some other easily user-editable place
- private static final Map MAPPERS = new HashMap();
- static {
- // detectors...
- MAPPERS.put( "HSQL Database Engine", new VersionInsensitiveMapper( "org.hibernate.dialect.HSQLDialect" ) );
- MAPPERS.put( "H2", new VersionInsensitiveMapper( "org.hibernate.dialect.H2Dialect" ) );
- MAPPERS.put( "MySQL", new VersionInsensitiveMapper( "org.hibernate.dialect.MySQLDialect" ) );
- MAPPERS.put( "PostgreSQL", new VersionInsensitiveMapper( "org.hibernate.dialect.PostgreSQLDialect" ) );
- MAPPERS.put( "Apache Derby", new VersionInsensitiveMapper( "org.hibernate.dialect.DerbyDialect" ) );
- <SPAN>...</SPAN>
由於我們的系統中用到了好幾個數據源,經常也是對應不同類型的數據庫,並且數據源都是由容器提供的,在首次部署時經常因爲數據庫類型變了而忘了修改對應的數據庫方言,而出了問題,這給實施人員帶來了很多的不便。不過目前除了對各種數據庫提供與以上硬編碼相同的數據庫產品名稱的驅動程序外,我們就只能自己動手了。