Hibernate中的方言

时间:2010-12-16 04:47:39

标签: hibernate

Hibernate与数据库无关。因此,无论我们在应用程序中使用何种数据库,我们都需要设置与该数据库相关的 dialect

例如,假设我们使用的是MySQL数据库,那么我们需要以下方言: org.hibernate.dialect.MySQLDialect

假设我们使用的是SQL Server数据库,那么我们需要以下方言: org.hibernate.dialect.SQLServerDialect并

Hibernate将生成与该数据库相关的适当查询。 我的问题是hibernate使用哪种机制来生成基于数据库的查询?

2 个答案:

答案 0 :(得分:9)

不确定我理解你的问题,但我会尝试:-)

首先, 某些东西适用于所有数据库,而其他东西则特定于某些数据库(例如"当前的日期和时间是什么?&#34 )。对于在所有数据库中都有效的东西,方言没有什么特别之处。

但对于可能与数据库不同的所有部分,Hibernate使用Dialect。方言是一个帮助者"用于Hibernate以其语言与数据库通信。例如,在某些时候,Hibernate代码需要知道JDBC类型" Types.TIMESTAMP"的数据库数据类型是什么。 "核心" Hibernate的代码只是说"给我这个db的等价于Types.TIMESTAMP",以及具体的Dialect答案。

对于SQL生成(或查询生成,如您所问),也会发生同样的情况。 Hibernate知道基本结构,但它也在Dialect中提供了一些钩子,以便特定的Dialect可以说"我不支持功能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

答案 1 :(得分:3)

如果我们在Hibernate中使用Dialects,则无论数据库类型如何,hibernate中的任何查询都将转换为特定于数据库的查询。 Hibernate支持HQL查询,在内部这些HQL查询将转换为本机数据库SQL调用。