Hibernate中的方言–方言是Java JDBC类型和SQL类型之间的类和桥梁,其中包含Java语言数据类型和数据库数据类型之间的映射。Dialect允许Hibernate生成针对特定关系数据库优化的SQL。Hibernate基于Dialect该类为特定数据库生成查询。
- 创建JPAEntityManagerFactory或HibernateSessionFactory实例后,Dialect将在内部创建该实例。
- 当Dialect实例创建时,它注册所有的配置提供方言的SQL函数,翻译Hibernate查询SQL查询,也登记所有SQL类型和Java JDBC类型到Java类型映射到数据库类型,反之亦然。
- 对于所有数据库,SQL类型都不相同,因此特定的数据库将具有特定的方言,例如,DB2数据库的org.hibernate.dialect.DB2Dialect方言是,MySql 5数据库的方言是org.hibernate.dialect.MySQL5Dialect。
- 从一个数据库切换到另一个数据库时,一项主要更改就是将对应的Dialect更改为该数据库。
- 要实现自定义方言,扩展Dialect类Sub类应提供一个公共的默认构造函数,该构造函数注册一组类型映射和默认的Hibernate属性。子类应该是不可变的。
2.示例方言配置
2.1。hibernate.properties示例:db2数据库的Hibernate方言
hibernate.connection.driver_class = com.ibm.db2.jcc.DB2Driver
hibernate.connection.url = jdbc:db2://<host>:<port50000>/<dbname>
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.dialect = org.hibernate.dialect.DB2Dialect
2.2。hibernate.cfg.xml示例:org.hibernate.dialect.MySQL8Dialect
<property name="connection.url">jdbc:mysql://localhost:3306/jpa_jbd?serverTimezone=UTC&useSSL=false</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
2.3。HibernateConfiguration示例:mysql方言
Configuration cfg = new Configuration()
.addClass(org.javabydeveloper.domain.Student.class)
.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL5Dialect")
.setProperty("hibernate.connection.datasource","jdbc:mysql://localhost:3306/<dbname>")
.setProperty("hibernate.order_updates","true");
2.4。JPA persistence.xml示例:PostgreSQL方言
<persistence-unit name="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/dbName" />
<property name="javax.persistence.jdbc.user" value="dbuser" />
<property name="javax.persistence.jdbc.password" value="password" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
</properties>
</persistence-unit>
3.为什么要在Hibernate中使用方言?
当需要将实体映射和Hibernate查询转换为特定于数据库的特定查询时,Hibernate会使用Dialect生成所有实体映射和Hibernate查询到“特定数据库”查询,并使用JDBC来执行它们。让我们看一个示例,下图显示了有关Dialect的清晰图片。
如果将hbm2ddl.auto设置为在配置中创建并创建会话工厂new Configuration().configure().buildSessionFactory():
- 对于所有实体,Hibernate都会为创建表生成本机查询,并使用JDBC执行该查询。
- 为了生成本机查询,Hibernate使用您的实体映射并使用提供的方言类将Java类型映射到数据库数据类型。
- 同样,当需要创建特定于数据库的查询时,Hibernate将使用Dialect类。
如果未在配置中指定Dialect类,则对于大多数Hibernate数据库,请尝试从数据库连接解析方言名称。最好的做法是提供方言,以便HibernateDialect为特定的数据库版本标识适当的类。
org.hibernate.dialect包中提供了所有Hibernate方言。以下是Hibernate中流行的SQL方言列表。
方言名称 |
方言类 |
描述 |
DB2 |
DB2的SQL方言。 |
|
DB2 AS / 400 |
DB2 / 400的SQL方言。 |
|
DB2 OS390 |
DB2 / 390的SQL方言。 |
|
DB2390V8方言 |
DB2 / 390版本8的SQL方言。 |
|
DB2400V7R3Dialect |
i的SQL方言。 |
|
DB297方言 |
DB2 9.7的SQL方言。 |
|
H2 |
与H2数据库兼容的方言。 |
|
HyperSQL(HSQL) |
与HSQLDB(HyperSQL)兼容的SQL方言。 |
|
Informix |
似乎可以与Informix Dynamic Server版本7.31.UD3,Informix JDBC驱动程序版本2.21JC3一起使用。 |
|
英格利斯 |
用于Ingres 9.2的SQL方言。 |
|
英格利斯9 |
用于Ingres 9.3和更高版本的SQL方言。 |
|
Ingres 10 |
用于Ingres 10和更高版本的SQL方言。 |
|
玛丽亚方言 |
这是所有MariaDB方言的基类,并且可以与任何MariaDB版本一起使用 |
|
玛丽亚DB53方言 |
旨在与MariaDB 5.3或更高版本一起使用 |
|
玛丽亚DB10方言 |
MariaDB 10或更高版本 |
|
玛丽亚DB103方言 |
适用于MariaDB 10.3和更高版本的SQL方言提供序列支持,锁定超时等。 |
|
玛丽亚DB102方言 |
MariaDB 10.2或更高版本 |
|
Microsoft SQL Server 2000 |
Microsoft SQL Server 2000的方言 |
|
Microsoft SQL Server 2005 |
Microsoft SQL 2005的方言。 |
|
Microsoft SQL Server 2008年 |
带有JDBC Driver 3.0及更高版本的Microsoft SQL Server 2008的方言 |
|
Microsoft SQL Server 2012 |
Microsoft SQL Server 2012方言 |
|
的MySQL |
MySQL的SQL方言(低于5.x)。 |
|
带有InnoDB的MySQL |
弃用使用“ hibernate.dialect.storage_engine = innodb”环境变量或JVM系统属性。 |
|
MySQL与MyISAM |
不建议使用“ hibernate.dialect.storage_engine = myisam”环境变量或JVM系统属性。 |
|
MySQL5的 |
用于MySQL 5.x特定功能的SQL方言。 |
|
带有InnoDB的MySQL5 |
弃用使用“ hibernate.dialect.storage_engine = innodb”环境变量或JVM系统属性。 |
|
MySQL8方言 |
MySQL 8.x特定功能的SQL方言。 |
|
甲骨文8i |
Oracle 8i的方言。 |
|
甲骨文9i |
Oracle 9i数据库的方言。 |
|
Oracle 10g及更高版本 |
专用于Oracle 10g的方言。 |
|
甲骨文12cDialect |
Oracle 12c的SQL方言。 |
|
OracleTypesHelper |
用于处理OracleTypes类的助手 |
|
PostgreSQL 8.1 |
Postgres的SQL方言 |
|
PostgreSQL 8.2 |
用于Postgres 8.2和更高版本的SQL方言,在删除表时增加了对“如果存在”的支持 |
|
PostgreSQL 9及更高版本 |
Postgres 9及更高版本的SQL方言。 |
|
PostgreSQL91语言 |
用于Postgres 9.1和更高版本的SQL方言添加了对PARTITION BY的支持,作为关键字。 |
|
PostgreSQL92方言 |
Postgres 9.2及更高版本的SQL方言增加了对JSON数据类型的支持 |
|
PostgreSQL93方言 |
PostgreSQL 9.3及更高版本的SQL方言。 |
|
PostgreSQL94方言 |
Postgres 9.4及更高版本的SQL方言。 |
|
PostgreSQL95方言 |
Postgres 9.5及更高版本的SQL方言。 |
|
PostgreSQL方言 |
不推荐使用使用 PostgreSQL82Dialect 替代 |
|
PostgresPlus方言 |
Postgres Plus的SQL方言 |
|
SAP数据库 |
与SAP DB兼容的SQL方言。 |
|
SAP HANA(列存储) |
SAP HANA列存储的SQL方言。 |
|
SAP HANA(行存储) |
SAP HANA行存储的SQL方言。 |
|
Sybase公司 |
所有Sybase方言共享一个IN列表大小限制。 |
|
Sybase 11 |
适用于Sybase 11.9.2的SQL方言(特别是:避免使用ANSI JOIN语法) |
|
Sybase ASE 15.5 |
针对Sybase Adaptive Server Enterprise(ASE)15及更高版本的SQL方言。 |
|
Sybase ASE 15.7 |
针对Sybase Adaptive Server Enterprise(ASE)15.7和更高版本的SQL方言。 |
|
Sybase Anywhere |
用于Sybase Anywhere的SQL方言扩展了Sybase(企业)方言(在ASA 8.x上测试) |
|
Teradata14方言 |
Teradata数据库的方言 |
|
Teradata |
MCR在方言认证过程中为Teradata数据库创建的方言。 |
5.结论
在本指南中,我们介绍了什么是方言以及为什么要在“Hibernate”和“流行的Hibernate方言列表”中使用它。
参考文献
原文地址:https://blog.csdn.net/allway2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。