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方言列表”中使用它。
参考文献