【问题标题】:Dialect in Hibernate休眠中的方言
【发布时间】:2010-12-16 04:47:38
【问题描述】:

Hibernate 独立于数据库。因此,无论我们将在应用程序中使用什么数据库,我们都需要设置与该数据库相关的方言

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

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

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

【问题讨论】:

    标签: hibernate


    【解决方案1】:

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

    首先,有些东西适用于所有数据库,而另一些则特定于某些数据库(例如“当前日期和时间是什么?”)。对于适用于所有数据库的东西,方言没有什么特别的。

    但是对于可能与数据库不同的所有部分,Hibernate 使用方言。方言是 Hibernate 用其语言与数据库通信的“帮手”。例如,在某些时候,Hibernate 代码需要知道 JDBC 类型“Types.TIMESTAMP”的数据库数据类型是什么。 Hibernate 的“核心”代码只是说“给我这个 db 相当于 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-03
        • 2018-10-23
        • 2015-10-20
        • 1970-01-01
        相关资源
        最近更新 更多