Hibernate 为什么需要配置数据源的SQL方言?

Hibernate 为什么需要配置数据源的SQL方言?,hibernate,configuration,eclipselink,persistence.xml,dialect,Hibernate,Configuration,Eclipselink,Persistence.xml,Dialect,当我们使用Hibernate配置数据源时,我们应该添加Hibernate.dialogue属性(或者eclipselink.target数据库,如果您使用的是eclipselink) 我想知道方言是什么意思?我根据Hibernate的文档配置了这个属性,但我不知道它是什么意思。方言是数据库使用的SQL方言 为了冬眠 在hibernate.cfg.xml中提供以下内容: <hibernate-configuration> <session-factory name="ses

当我们使用Hibernate配置数据源时,我们应该添加
Hibernate.dialogue
属性(或者
eclipselink.target数据库,如果您使用的是eclipselink)


我想知道方言是什么意思?我根据Hibernate的文档配置了这个属性,但我不知道它是什么意思。

方言是数据库使用的SQL方言

为了冬眠

在hibernate.cfg.xml中提供以下内容:

<hibernate-configuration>
   <session-factory name="session-factory">
      <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
       ...
   </session-factory>
</hibernate-configuration>
方言的意思是“语言的变体”。我们知道,Hibernate是数据库不可知的。它可以与不同的数据库一起工作。但是,数据库有专有的扩展/本机SQL变体,以及SQL标准实现的集合/子集。因此,hibernate有时必须使用特定于数据库的SQL。Hibernate使用“方言”配置来了解您使用的是哪个数据库,以便它可以在任何需要的地方/任何时候切换到特定于数据库的SQL生成器代码。

简短回答


hibernate.dialogue
属性使hibernate为所选数据库生成适当的SQL语句。

数据库在使用的
SQL
中实现细微的差异。例如,不同数据库的数据类型不同(例如,在Oracle中,您可以将整数值放在数字字段中,在SQL Server中使用int字段)。或特定于数据库的功能-根据数据库的不同,选择前n行是不同的。方言抽象了这一点,所以你不必担心它

属性告诉Hibernate为所选数据库生成适当的SQL语句

可在此处找到可用方言列表:

简短回答 “JDBC的讽刺之处在于,尽管编程接口 SQL语言不是可移植的 如果将其标准化,那么编写任何复杂程度的SQL仍然很少见 将在两个主要数据库平台上运行,即使SQL 方言是相似的,每个数据库根据不同的语言执行不同的操作 查询的结构,需要特定于供应商的调整 大多数情况下。”

…从掌握Java持久性API的Pro JPA 2上偷来,第1章,第9页

因此,我们可能认为JDBC是抽象掉所有与数据库相关的东西的最终规范,但事实并非如此

引用第4.4章第20页:

驱动程序层可能会掩盖标准SQL:2003语法之间的差异 以及数据源支持的本地方言

May不能保证驱动程序会这样做,因此我们应该提供方言,以便应用程序正常工作。在最好的情况下,应用程序可以工作,但如果持久性提供程序知道要使用哪种方言,则可能无法有效运行。在Hibernate的情况下,除非您向他提供方言,否则他将拒绝部署您的应用程序

那么呢? JDBC规范没有提到JPQL这个词。JDBC是一种标准化的数据库访问方式。仔细阅读,您会发现,一旦应用程序能够访问数据库,就必须向JDBC兼容驱动程序中输入香草=未修饰的SQL

值得注意的是,JPQL是一种查询语言,而不是数据定义语言(DDL)。因此,即使我们可以向JDBC驱动程序提供JPQL,在解析
persistence.xml
文件和设置表的阶段,持久性提供程序也没有用

仔细看看这个酒店 以下是Hibernate和EclipseLink的一个示例,介绍如何在persistence.xml文件中指定Java DB方言,供您参考:

<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/>
<property name="eclipselink.target-database" value="JavaDB"/>

物业是强制性的吗? 从理论上讲,该属性还没有标准化,而且该属性也没有提到SQL方言。因此,我们运气不佳,必须求助于针对供应商的实证研究和相关文件

Hibernate拒绝接受未指定属性的部署存档,从而使该存档无法部署。说:

始终将hibernate.dialogue属性设置为正确的 数据库的org.hibernate.dialent.dialent子类

这很清楚。请注意,文档中列出的方言专门针对一家或另一家供应商。没有“通用”方言或类似的东西。考虑到该属性是成功部署的绝对要求,您可能会认为绑定Hibernate的WildFly应用服务器应该说些什么,但事实并非如此

另一方面,日食更宽容一点。如果不提供属性,则部署将部署(也不会发出警告)。说:

使用eclipselink.target-database属性指定数据库 要使用,请控制的自定义操作和SQL生成 指定的数据库

这个话题是关于“自定义操作和SQL生成”,这意味着如果你问我的话,它有点模糊。但有一点是明确的:他们没有说财产是强制性的。还请注意,其中一个可用值是“数据库”,它表示“通用数据库”目标。嗯,那是什么“方言”?SQL 2.0??但是再一次,这个属性被称为“目标数据库”,而不是“方言”,所以可能“数据库”翻译成根本没有SQL。现在转到捆绑EclipseLink的GlassFish服务器。(第6-3页)上说:

您可以将可选的eclipselink.target-database属性指定为 确保数据库类型正确

所以GlassFish认为这个属性是“可选的”,附加值是我实际使用Java DB的“保证”——以防我不知道

结论
复制粘贴你在谷歌上能找到的任何东西,并向上帝祈祷。

SQL方言转换我们用java或任何其他对象编写的HQL查询
RDBMS                   Dialect
DB2                     org.hibernate.dialect.DB2Dialect
DB2 AS/400              org.hibernate.dialect.DB2400Dialect
DB2 OS390               org.hibernate.dialect.DB2390Dialect
PostgreSQL              org.hibernate.dialect.PostgreSQLDialect
MySQL                   org.hibernate.dialect.MySQLDialect
MySQL with InnoDB       org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM       org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version)    org.hibernate.dialect.OracleDialect
Oracle 9i/10g           org.hibernate.dialect.Oracle9Dialect
Sybase                  org.hibernate.dialect.SybaseDialect
Sybase Anywhere         org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server    org.hibernate.dialect.SQLServerDialect
SAP DB                  org.hibernate.dialect.SAPDBDialect
Informix                org.hibernate.dialect.InformixDialect
HypersonicSQL           org.hibernate.dialect.HSQLDialect
Ingres                  org.hibernate.dialect.IngresDialect
Progress                org.hibernate.dialect.ProgressDialect
Mckoi SQL               org.hibernate.dialect.MckoiDialect
Interbase               org.hibernate.dialect.InterbaseDialect
Pointbase               org.hibernate.dialect.PointbaseDialect
FrontBase               org.hibernate.dialect.FrontbaseDialect
Firebird                org.hibernate.dialect.FirebirdDialect
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/>
<property name="eclipselink.target-database" value="JavaDB"/>
hibernate.dialect