为什么我需要configuration数据源的SQL方言?
当我们使用Hibernateconfiguration一个数据源时,我们应该添加hibernate.dialect
属性(或者如果您使用的是EclipseLink,则添加eclipselink.target-database
)。
我想知道方言的含义是什么? 我根据Hibernate的文档来configuration这个属性,但我不知道它的含义。
方言的意思是“一种语言的变体”。 如我们所知,Hibernate是数据库不可知的。 它可以使用不同的数据库。 但是,数据库具有专有扩展/原生SQL变体,以及SQL标准实现的设置/子集。 因此在某些时候,hibernate必须使用特定于数据库的SQL。 Hibernate使用“方言”configuration来知道您正在使用哪个数据库,以便在任何/必要时切换到数据库特定的SQL生成器代码。
简短的回答
“JDBC的讽刺之处在于,尽pipe编程接口是可移植的,但是SQL语言却不是,虽然有很多尝试将其标准化,但是在任何复杂的SQL上编写SQL仍然是很less见的。在SQL方言相似的地方,每个数据库的查询结构都有所不同,因此在大多数情况下都需要特定于供应商的调整。
从专业JPA 2掌握Java持久性API ,第1章,第9页
所以,我们可以把JDBC看作是抽象出与数据库相关的一切的最终规范,但事实并非如此。
来自JDBC规范的第4.4章第20页的引用:
驱动程序层可能会掩盖标准SQL:2003语法与数据源支持的本地方言之间的差异。
可能不能保证司机会 ,因此我们应该提供方言,以便有一个工作的应用程序。 在最好的情况下,应用程序可以工作,但如果持久性提供程序知道使用哪种方言,可能无法有效运行。 在Hibernate的情况下,他会拒绝部署你的应用程序,除非你喂他的方言。
那么JPQL呢?
JDBC规范没有提到JPQL这个词。 JDBC是数据库访问的标准化方式。 阅读这个JavaDoc ,你会发现,一旦应用程序可以访问数据库,必须提供给JDBC兼容的驱动程序是vanilla = undecorated SQL。
值得注意的是,JPQL是一种查询语言,而不是数据定义语言(DDL)。 所以即使我们可以使用JPQL来提供JDBC驱动程序,那么在parsingpersistence.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文档说:
总是将hibernate.dialect属性设置为数据库正确的org.hibernate.dialect.Dialect子类。
所以这很清楚。 请注意,文档中列出的方言是专门针对一个或另一个供应商的。 没有“通用”方言或类似的东西。 假设这个属性是一个成功部署的绝对要求,那么你会期望包含Hibernate的WildFly应用服务器的文档应该说些什么,但是它不会。
另一方面EclipseLink更宽容一点。 如果您不提供该属性,则部署将部署(不会有警告)。 EclipseLink文档说:
使用eclipselink.target-database属性指定要使用的数据库,控制指定数据库的自定义操作和SQL生成。
这个话题是关于“自定义操作和SQL生成”的,这意味着如果你问我,这有点模糊。 但有一点是明确的:他们并不是说这个财产是强制性的。 另请注意,其中一个可用值是“数据库”,表示“通用数据库”目标。 嗯,那是什么“方言”呢? SQL 2.0 ?? 但是再一次,该属性被称为“目标数据库”,而不是“方言”,所以也许“数据库”转换为没有SQL的所有lol。 转到捆绑EclipseLink的GlassFish服务器。 文档 (第6-3页)说:
您可以指定可选的eclipselink.target-database属性来保证数据库types是正确的。
所以GlassFish认为属性是“可选的”,增值是我实际上使用Java DB的“保证” – 以防万一我不知道。
结论
复制粘贴任何你可以find谷歌和向上帝祈祷。
Hibernate.dialect
属性告诉Hibernate为所选数据库生成适当的SQL语句。
可用的方言列表可以在这里find: 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
简短的回答
hibernate.dialect
属性使得Hibernate为选定的数据库生成适当的SQL语句。
方言是数据库使用的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
数据库在他们使用的SQL
实现细微的差异。 诸如数据types之类的东西在不同的数据库中是不同的(例如,在Oracle中你可能会在数字字段中input一个整数值,在SQL Server中使用一个int字段)。 或数据库特定的function – 根据数据库的不同,select前n行是不同的。 方言抽象这个,所以你不必担心它。
SQL方言将我们在Java或任何其他面向对象程序中编写的HQL查询转换为特定的数据库SQL。
例如在Java中,假设我写了List employees = session.createQuery(“FROM Employee”)。
但是当我的方言是<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
在访问MySQL数据库之前,HQL(“FROM Employee”)被转换为“SELECT * FROM EMPLOYEE”
在Hibernate上下文中,方言会照顾数据库的数据types,就像在orace中它是整数,但是在SQL中它是int,所以这个在hibernate中被这个属性所知,如何在内部映射这些字段。
Hibernate使用“dialect”configuration来知道你正在使用哪个数据库,以便它可以将hibernate查询转换成数据库特定的查询。
方言属性在以下方面被hibernate使用
- 生成优化的SQL查询。
- 如果你有多个数据库,然后与你想要的特定数据库交谈。
- 要根据我们使用的数据库软件为hibernateconfiguration文件属性设置默认值,即使它们没有在configuration文件中指定。
方言是一种特定群体所说的语言的一种forms。
这里,在hibernate框架的环境中,当hibernate想要与使用方言的数据库交谈 (使用查询)时。
SQL方言源自结构化查询语言,它使用人类可读的expression式来定义查询语句。
Hibernate方言为如何将 Hibernate查询(HQL)转换为原生SQL查询提供了信息。
hibernate的方言可以使用下面的属性来configuration:
hibernate.dialect
这里是hibernate方言的完整列表。
注意: hibernate的方言属性不是强制性的。