当我们使用 Hibernate 配置数据源时,我们应该添加hibernate.dialect
属性(或者eclipselink.target-database
如果您使用的是 EclipseLink)。
我想知道方言是什么意思?我根据Hibernate的文档配置了这个属性,但是不知道是什么意思。
当我们使用 Hibernate 配置数据源时,我们应该添加hibernate.dialect
属性(或者eclipselink.target-database
如果您使用的是 EclipseLink)。
我想知道方言是什么意思?我根据Hibernate的文档配置了这个属性,但是不知道是什么意思。
方言的意思是“一种语言的变体”。众所周知,Hibernate 与数据库无关。它可以与不同的数据库一起工作。但是,数据库具有专有扩展/原生 SQL 变体,以及 SQL 标准实现的集合/子集。因此,在某些时候,hibernate 必须使用特定于数据库的 SQL。Hibernate 使用“方言”配置来了解您正在使用哪个数据库,以便它可以随时随地切换到特定于数据库的 SQL 生成器代码。
“JDBC 具有讽刺意味的是,尽管编程接口是可移植的,但 SQL 语言却不是。尽管进行了多次标准化尝试,但编写在两个主要数据库平台上运行不变的复杂 SQL 仍然很少见。甚至在 SQL 方言相似的地方,每个数据库根据查询结构执行不同的操作,在大多数情况下需要针对供应商进行调整。”
..stolen from Pro JPA 2 Mastering the Java Persistence API,第 1 章,第 9 页
因此,我们可能会将 JDBC 视为抽象出与数据库相关的所有内容的最终规范,但事实并非如此。
引用JDBC 规范,第 4.4 章,第 20 页:
驱动层可能会掩盖标准 SQL:2003 语法和数据源支持的本地方言之间的差异。
可能无法保证驱动程序会,因此我们应该提供方言才能有一个工作应用程序。在最好的情况下,如果持久性提供者知道要使用哪种方言,应用程序将可以工作,但可能不会像它可以那样有效地运行。在 Hibernate 的情况下,他将拒绝部署您的应用程序,除非您向他提供方言。
JDBC 规范没有提到 JPQL 这个词。JDBC 是一种标准化的数据库访问方式。去阅读这个 JavaDoc,你会发现一旦应用程序可以访问数据库,必须输入 JDBC 兼容驱动程序的是 vanilla = undecorated 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"/>
从理论上讲,该属性尚未标准化,JPA 2.1 规范对 SQL 方言只字未提。所以我们运气不好,必须求助于供应商特定的实证研究和文档。
Hibernate拒绝接受未指定属性的部署存档,该属性使存档不可部署。休眠文档说:
始终将 hibernate.dialect 属性设置为数据库的正确 org.hibernate.dialect.Dialect 子类。
所以这很清楚。请注意,文档中列出的方言专门针对一个或另一个供应商。没有“通用”方言或类似的东西。鉴于该属性是成功部署的绝对要求,您会期望捆绑 Hibernate 的 WildFly 应用程序服务器的文档应该说明一些内容,但事实并非如此。
另一方面,EclipseLink更宽容一些。如果您不提供该属性,则会部署部署(也不会发出警告)。EclipseLink 文档说:
使用 eclipselink.target-database 属性指定要使用的数据库,控制指定数据库的自定义操作和 SQL 生成。
谈话是关于“自定义操作和 SQL 生成”的,如果你问我,意思是有点模糊。但有一点很清楚:他们没有说财产是强制性的。另请注意,可用值之一是代表“通用数据库”目标的“数据库”。嗯,那是什么“方言”?SQL 2.0?? 但是话又说回来,该属性被称为“目标数据库”而不是“方言”,因此“数据库”可能根本不会转换为 SQL,哈哈。转到捆绑 EclipseLink 的 GlassFish 服务器。文档(“6-3”页)说:
您可以指定可选的 eclipselink.target-database 属性以保证数据库类型正确。
因此,GlassFish 认为该属性是“可选的”,而附加值是我实际使用 Java DB 的“保证”——以防我不知道。
复制粘贴你在谷歌上能找到的任何东西,然后向上帝祈祷。
Hibernate.dialect
属性告诉 Hibernate 为所选数据库生成适当的SQL语句。
可以在此处找到可用方言的列表:http: //javamanikandan.blogspot.in/2014/05/sql-dialects-in-hibernate.html
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
方言是您的数据库使用的SQL 方言。
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.dialect=org.hibernate.dialect.SQLServerDialect
简短的回答
hibernate.dialect
属性使 Hibernate 为所选数据库生成适当的 SQL 语句。
Hibernate 使用“方言”配置来了解您正在使用哪个数据库,以便它可以将 hibernate 查询转换为特定于数据库的查询。
SQL 方言将我们在 java 或任何其他面向对象程序中编写的 HQL 查询转换为特定的数据库 SQL。
例如在java中假设我写 List employees = session.createQuery("FROM Employee").list();
但是当我的方言是
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
HQL(“FROM Employee”)在访问 MySQL 数据库之前被转换为“SELECT * FROM EMPLOYEE”
数据库实现了SQL
它们使用的细微差别。例如,数据类型之类的东西因数据库而异(例如,在 Oracle 中,您可以将整数值放在数字字段中,而在 SQL Server 中使用 int 字段)。或特定于数据库的功能 - 选择前 n 行因数据库而异。方言对此进行了抽象,因此您不必担心。
Hibernate 上下文中的方言将处理数据库数据类型,例如在 orace 中它是整数,但在 SQL 中它是 int,因此在 hibernate 中通过此属性知道如何在内部映射字段。
方言是特定人群使用的一种语言形式。
在这里,在 hibernate 框架的上下文中,当 hibernate 想要与数据库交谈(使用查询)时,它使用方言。
SQL 方言源自结构化查询语言,它使用人类可读的表达式来定义查询语句。hibernate 方言向框架提供了如何
将hibernate查询 (HQL) 转换为本地 SQL 查询的信息。
可以使用以下属性配置休眠的方言:
hibernate.dialect
这里,是一个完整的休眠方言列表。
注意: hibernate 的 dialect 属性不是必须的。
Dialect property is used by hibernate in following ways