hibernate的方言
来源:互联网 发布:黄金交易软件手机版 编辑:程序博客网 时间:2024/05/01 21:26
- hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系型数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异,因此Hibernate需要根据数据库来识别这些差异。
举例来说,我们在MySQL数据库里进行分页查询,只需使用limit关键字就可以了;而标准SQL并不支持limit关键字,例如Oracle则需要使用行内视图的方式来进行分页。同样的应用程序,当我们在不同数据库之间迁移时,底层数据库的访问细节会发生改变,而Hibernate也为这种改变做好了准备,现在我们需要做的是:告诉Hibernate应用程序的底层即将使用哪种数据库——这就是数据库方言。
一旦我们为Hibernate设置了合适的数据库方言,Hibernate将可以自动应付底层数据库访问所存在的细节差异。
不同数据库所应使用的方言如表5.1所示。
表 不同数据库及其对应方言
关系数据库
方 言
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
org.hibernate.dialect.Oracle9iDialect
Oracle 10g
org.hibernate.dialect.Oracle10gDialect
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将会给你带来很多的方便,想信很多接触Hibernate的人都会体会到。Hibernate底层是通过dialect包来对各种数据库的差异进行抽象的。Dialect类中实现每种数据库相同的东西,而不同数据库对应会有该类的一个扩展实现,最终通过DialectFactory来决定创建哪一个类。通常我们都会指定hibernate.dialect属性,那直接创建该属性对应的类。如果我们没有指定该属性,那么由Hibernate自己决定选择合适的方言。在DialectFactory中初始化各种数据库对应的方言的Map,以数据库产品名为key,以方言的包装对象为value。Hibernate自动选择方言时,会通过JDBC的DatabaseMetadata取得数据库的产品名称,根据名称取得对应的方言。DialectFactory中对该Map的初始化的部分代码如下: - // TODO : this is the stuff it'd be nice to move to a properties file or some other easily user-editable place
- private static final Map MAPPERS = new HashMap();
- static {
- // detectors...
- MAPPERS.put( "HSQL Database Engine", new VersionInsensitiveMapper( "org.hibernate.dialect.HSQLDialect" ) );
- MAPPERS.put( "H2", new VersionInsensitiveMapper( "org.hibernate.dialect.H2Dialect" ) );
- MAPPERS.put( "MySQL", new VersionInsensitiveMapper( "org.hibernate.dialect.MySQLDialect" ) );
- MAPPERS.put( "PostgreSQL", new VersionInsensitiveMapper( "org.hibernate.dialect.PostgreSQLDialect" ) );
- MAPPERS.put( "Apache Derby", new VersionInsensitiveMapper( "org.hibernate.dialect.DerbyDialect" ) );
- <SPAN>...</SPAN>
原本上,这种自动选择的方式,会给我们带来方便,只可惜,从以上的代码的注释中可以知道,目前这一部分的初始化是通过硬编码的,只有在以后的版本才会移动到配置文件或其他容易用户编译的地方,否则,我们可以非常容易的添加我们的配置供Hibernate进行自动选择。而经常我们所使用的数据库驱动程序所取到的数据库产品名称会跟以上硬编码的不同,所以最终我们还是得自己配置数据库方言。
由于我们的系统中用到了好几个数据源,经常也是对应不同类型的数据库,并且数据源都是由容器提供的,在首次部署时经常因为数据库类型变了而忘了修改对应的数据库方言,而出了问题,这给实施人员带来了很多的不便。不过目前除了对各种数据库提供与以上硬编码相同的数据库产品名称的驱动程序外,我们就只能自己动手了。
- hibernate 的SQL方言
- hibernate支持的方言
- hibernate 方言的作用
- hibernate的方言
- hibernate的方言是什么??
- 获取hibernate的方言dialect
- Hibernate的dialect 方言大全
- Hibernate 支持的数据库方言
- hibernate 方言
- hibernate 方言
- hibernate方言
- hibernate对应的ORDBMS的方言
- Hibernate多数据库的连接方言
- jBPM4中配置MySQL的hibernate方言
- Hibernate 不同数据库的SQL方言
- hibernate的db2方言分页问题
- Hibernate的数据库方言错误值
- Hibernate多种数据库的连接方言
- FTP命令全集
- DList双向链表
- Android性能优化
- 增加yum支持EPEL源
- intellij idea 注册服务器
- hibernate的方言
- 使用windows 窗体应用程序编写简单的阅读器
- Citrix 桌面虚拟化解决方案与VMware桌面虚拟化解决方案对比
- app跨域问题
- pdf文件怎么转换成word格式的文件
- Log4net入门使用
- eclipse tomcat ClassNotFoundException
- Face++ 人脸检测之POST[img](0)
- eclipse安装FreeMarker IDE