为什么';t Hibernate找出';方言';从指定的数据库驱动程序?

为什么';t Hibernate找出';方言';从指定的数据库驱动程序?,hibernate,Hibernate,我是冬眠新手,可能缺少一些基本的东西 Hibernate是独立于数据库的。所以,无论我们在应用程序中使用什么数据库,我们都需要设置与该数据库相关的方言 但我们为什么需要它呢?Hibernate不能通过我们已经指定的DB驱动程序的类型来了解这一点吗?据我所知,您对驱动程序和方言有些困惑。共有两个不同的概念 您需要数据库驱动程序来实现连接到数据库、执行查询并获得结果等功能。但由于hibernate是一个ORM框架,我们在这里有另一层,hibernate首先需要将诸如save(Object)之类的操作

我是冬眠新手,可能缺少一些基本的东西

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


但我们为什么需要它呢?Hibernate不能通过我们已经指定的DB驱动程序的类型来了解这一点吗?

据我所知,您对驱动程序和方言有些困惑。共有两个不同的概念

您需要数据库驱动程序来实现连接到数据库、执行查询并获得结果等功能。但由于hibernate是一个ORM框架,我们在这里有另一层,hibernate首先需要将诸如save(Object)之类的操作转换为驱动程序可以理解和执行的查询。所以方言基本上就是hibernate用于这些转换的语法


此外,最好将其解耦。为什么您希望依赖于驱动程序类(间接依赖于驱动程序提供程序),而不是让框架用户在可用方言之间进行选择。这有意义吗

Hibernate
首先检查配置文件中的
方言
属性,如果该属性丢失,则它将使用DB连接详细信息并尝试加载适合数据库的默认方言

有关详细信息,请参见此链接,其中说明:

构建适当的方言实例。如果一个方言是明确的 在传入属性中命名,应该使用它。否则就是 由基于传递的连接的方言解析程序确定

如果未显式设置方言且没有 解析器可以根据给定的连接进行确定

这里也写着:

在大多数情况下,Hibernate实际上能够选择正确的 基于JDBC的org.hibernate.dial.dial实现 JDBC驱动程序返回的元数据

此链接表示,如果指定方言,则hibernate会尝试根据给定方言向其他属性添加一些默认值:

始终将hibernate.dialogue属性设置为正确的 数据库的org.hibernate.dialent.dialent子类。如果你 指定一种方言,Hibernate将对其中一些语言使用合理的默认值 上面列出的其他属性。这意味着你不会有 手动指定它们


因此,最后建议指定方言,但即使您没有提供详细信息,hibernate也会尝试使用默认方言。

通常情况下,驱动程序和连接字符串使用真实驱动程序的代理。