2010-12-16 63 views
6

Hibernate與數據庫無關。因此,無論我們將在我們的應用程序中使用哪個數據庫,我們都需要設置與該數據庫相關的方言休眠方言

例如,假設我們使用MySQL數據庫,那麼我們需要以下方言: org.hibernate.dialect.MySQLDialect

假設我們使用SQL Server數據庫,那麼我們需要以下方言: org.hibernate作爲.dialect.SQLServerDialect

Hibernate將生成與該數據庫相關的適當查詢。 我的問題是,hibernate使用哪種機制來基於數據庫生成查詢?

回答

9

不知道我理解你的問題,但我會努力:-)

首先,有些事情在所有數據庫中,而其他的東西都是具體的某些數據庫(如工作,「什麼是當前日期和時間?「)。對於在所有數據庫中都有效的東西,方言並沒有特定的東西。

但是對於所有可能與數據庫不同的部分,Hibernate使用Dialect。方言是Hibernate與其數據庫語言溝通的「幫手」。例如,在某些時候,Hibernate代碼需要知道什麼是JDBC類型「Types.TIMESTAMP」的數據庫數據類型。 Hibernate的「核心」代碼只是說「給我這個數據庫的相當於Types.TIMESTAMP」,而具體的方言就是這樣回答的。

對於SQL生成(或查詢生成,正如您所問)一樣。 Hibernate知道基本結構,但它也提供了方言中的一些鉤子,以便特定的方言可以說「我不支持功能X」,或者,「對於功能Y,在查詢中使用字符串'abc'」。

當然,我的答案是整個過程的極端簡化。我建議閱讀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調用。