【发布时间】:2014-09-08 12:07:53
【问题描述】:
我是 Hibernate 的新手,可能缺少一些基本的东西。
Hibernate 独立于数据库。因此,无论我们将在应用程序中使用什么数据库,我们都需要设置与该数据库相关的方言。
但是我们为什么需要它呢? Hibernate 不能通过我们已经指定的 DB 驱动程序类型来解决这个问题吗?
【问题讨论】:
-
驱动程序和连接字符串通常使用真实驱动程序的代理。
标签: hibernate
我是 Hibernate 的新手,可能缺少一些基本的东西。
Hibernate 独立于数据库。因此,无论我们将在应用程序中使用什么数据库,我们都需要设置与该数据库相关的方言。
但是我们为什么需要它呢? Hibernate 不能通过我们已经指定的 DB 驱动程序类型来解决这个问题吗?
【问题讨论】:
标签: hibernate
Hibernate 首先检查配置文件中的dialect 属性,如果缺少该属性,则它使用数据库连接详细信息并尝试加载适合您的数据库的默认方言。
查看DialectFactory的链接,上面写着:
构建适当的方言实例。如果方言是明确的 在传入的属性中命名,应该使用它。否则就是 由方言解析器根据传递的连接确定。
如果没有明确设置方言并且没有 解析器可以根据给定的连接做出决定。
还有Optional configuration properties,上面写着:
在大多数情况下,Hibernate 实际上能够选择正确的 基于 JDBC 的 org.hibernate.dialect.Dialect 实现 JDBC 驱动程序返回的元数据。
SQL Dialects 的这个链接说,如果你指定方言,那么 hibernate 会尝试根据给定的方言为其他一些属性添加一些默认值:
始终将 hibernate.dialect 属性设置为正确的 org.hibernate.dialect.Dialect 数据库的子类。如果你 指定方言,Hibernate 将使用合理的默认值 上面列出的其他属性。这意味着您将没有 手动指定它们。
所以最后还是推荐指定方言,但即使你不提供详细信息,hibernate 也会尝试使用默认方言。
【讨论】:
据我了解,您对驱动程序和方言有些困惑。有两个不同的概念。
您需要数据库驱动程序来连接数据库并执行查询并获取结果。但是由于hibernate是一个ORM框架,我们这里又多了一层,hibernate首先需要将save(Object)之类的操作转化为驱动可以理解和执行的查询。所以方言基本上就是hibernate用于这些转换的语法。
此外,最好保持解耦。为什么要依赖于驱动程序类(间接依赖于驱动程序提供者),而不是让框架的用户在可用的方言之间进行选择。那有意义吗?
【讨论】: