为什么Hibernate没有从指定的DB驱动程序中找出'Dialect'?

时间:2014-09-08 12:07:53

标签: hibernate

我是Hibernate的新手,可能会遗漏一些基本的东西。

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

但为什么我们需要呢? Hibernate不能通过我们指定的DB驱动程序的类型来计算出来吗?

2 个答案:

答案 0 :(得分:1)

据我所知,你对司机和方言有些困惑。有两种不同的概念。

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

此外,最好保持它解耦。为什么要依赖于驱动程序类(间接地依赖于驱动程序提供程序),而是让框架的用户在可用的方言之间进行选择。那有意义吗?

答案 1 :(得分:1)

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

请参阅此DialectFactory的链接,它说:

  

构建适当的Dialect实例。如果方言是明确的   在传入属性中命名,应该使用它。否则就是   由方言解析器根据传递的连接确定。

     

如果没有明确设置方言而且没有方言,则抛出异常   解析器可以从给定的连接中做出决定。

此处还有Optional configuration properties,它说:

  

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

SQL Dialects的此链接说明,如果您指定方言,那么hibernate会尝试根据给定的方言为某些其他属性添加一些默认值

  

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

所以最后建议指定方言,但即使你没有提供细节,hibernate也会尝试使用默认方言。