当我们使用Hibernate配置数据源时,我们应该添加hibernate.dialect
属性(如果使用EclipseLink,则添加eclipselink.target-database
。)
我想知道 dialect 的含义是什么?我根据Hibernate的文档配置了这个属性,但我不知道它的含义是什么。
答案 0 :(得分:90)
方言是指“语言的变体”。我们知道,Hibernate与数据库无关。它可以用于不同的数据库。但是,数据库具有专有扩展/本机SQL变体,以及SQL标准实现的集合/子集。因此在某些时候hibernate必须使用特定于数据库的SQL。 Hibernate使用“方言”配置来了解您正在使用的数据库,以便它可以随时随地切换到特定于数据库的SQL生成器代码。
答案 1 :(得分:29)
" JDBC的讽刺是,虽然编程接口是 便携式,SQL语言不是。尽管有许多尝试 标准化它,编写任何复杂性的SQL仍然很少见 将在两个主要数据库平台上运行不变。即使在哪里SQL 方言类似,每个数据库的表现取决于 查询的结构,需要特定于供应商的调优 大多数情况。"
..从 Pro JPA 2掌握Java Persistence API ,第1章第9页中窃取
因此,我们可能会将JDBC视为抽象出与数据库相关的所有内容的最终规范,但它不是。
来自JDBC specification,第4.4章,第20页的引用:
驱动程序层可能掩盖标准SQL:2003语法之间的差异 和数据源支持的本机方言。
可能不能保证驱动程序 ,因此我们应该提供方言以便拥有一个有效的应用程序。在最佳情况下,应用程序可以正常工作,但如果持久性提供程序知道要使用哪种方言,则可能无法有效运行。在Hibernate的情况下,除非你用方言喂他,否则他将拒绝部署你的应用程序。
JDBC规范没有提到JPQL这个词。 JDBC是数据库访问的标准化方式。阅读this JavaDoc,你会发现,一旦应用程序可以访问数据库,必须提供给JDBC兼容驱动程序的是vanilla = undecorated SQL。
值得注意的是,JPQL是一种查询语言,而不是数据定义语言(DDL)。因此,即使我们可以使用JPQL提供JDBC驱动程序,在解析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 specification对SQL方言一无所知。因此,我们运气不好,必须转向供应商特定的实证研究和文档。
Hibernate 拒绝接受未指定该属性的部署存档,从而使存档可取消部署。 Hibernate documentation说:
始终将hibernate.dialect属性设置为正确 org.hibernate.dialect.Dialect数据库的子类。
所以这很清楚。请注意,文档中列出的方言专门针对一个或另一个供应商。没有&#34;泛型&#34;方言或类似的东西。鉴于该属性是成功部署的绝对要求,您可以期望捆绑Hibernate的WildFly应用服务器的documentation应该说些什么,但它没有。
另一方面,EclipseLink 更宽容一些。如果您未提供该属性,则部署部署(也不会发出警告)。 EclipseLink documentation说:
使用eclipselink.target-database属性指定数据库 使用,控制自定义操作和SQL生成 指定的数据库。
谈话是关于&#34;自定义操作和SQL生成&#34;,这意味着如果你问我,它有点模糊。但有一件事是清楚的:他们并不是说财产是强制性的。另请注意,其中一个可用值是&#34;数据库&#34;代表&#34;通用数据库&#34;目标。嗯,什么&#34;方言&#34;那会吗? SQL 2.0 ??但话说回来,该物业被称为&#34;目标数据库&#34;而不是&#34;方言&#34;所以也许&#34;数据库&#34;在任何情况下转换为没有SQL大声笑。继续使用捆绑EclipseLink的GlassFish服务器。 Documentation(第&#34; 6-3&#34;)说:
您可以指定可选的eclipselink.target-database属性 保证数据库类型正确。
所以GlassFish认为该物业是可选的&#34;并且增值是一个&#34;保证&#34;我实际上在使用Java DB - 以防我不知道。
复制粘贴谷歌上可以找到的任何内容并向上帝祈祷。
答案 2 :(得分:17)
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
答案 3 :(得分:5)
Dialect是您的数据库使用的 SQL dialect 。
List of SQL dialects用于Hibernate。
在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
答案 4 :(得分:5)
简短回答
hibernate.dialect
属性使Hibernate为所选数据库生成适当的SQL语句。
答案 5 :(得分:4)
Hibernate使用&#34; dialect&#34;配置以了解您正在使用哪个数据库,以便它可以将hibernate查询转换为特定于数据库的查询。
答案 6 :(得分:2)
数据库在他们使用的SQL
中实现细微差别。例如数据类型之类的东西因数据库而异(例如在Oracle中您可能在数字字段中放置一个整数值,在SQL Server中使用int字段)。或者特定于数据库的功能 - 根据数据库选择前n行是不同的。方言抽象了这个,所以你不必担心它。
答案 7 :(得分:2)
SQL方言将我们在java或任何其他面向对象程序中编写的HQL查询转换为特定的数据库SQL。
例如在java中我假设写 列出employees = session.createQuery(“FROM Employee”)。list();
但是当我的方言是
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
在点击MySQL数据库之前,HQL(“FROM Employee”)被转换为“SELECT * FROM EMPLOYEE”
答案 8 :(得分:2)
Hibernate上下文中的方言,会照顾数据库数据类型,就像在orace中它是整数但是在SQL中它是int,所以这将通过hibernate在这个属性中知道,如何在内部映射字段。 / p>
答案 9 :(得分:1)
方言是一种特定人群所使用的语言形式。
在这里,在hibernate框架的上下文中,当hibernate想要与数据库 talk (使用查询)时,它使用方言。
SQL方言源自结构化查询语言,该语言使用人类可读的表达式来定义查询语句。
hibernate dialect 为如何将 hibernate查询(HQL)转换为本机SQL查询的框架提供信息。
可以使用以下属性配置休眠方言:
hibernate.dialect
Here,是一个完整的hibernate方言列表。
注意: hibernate的dialect属性是不是必需。
答案 10 :(得分:0)
hlectnate以下列方式使用Dialect属性