hibernate 数据库配置为什么要配置数据库的方言

博客分类:
如果一个系统可能运行于多种数据库,或者同时使用多种数据库,那么,使用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();
// 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" ) );
原本上,这种自动选择的方式,会给我们带来方便,只可惜,从以上的代码的注释中可以知道,目前这一部分的初始化是通过硬编码的,只有在以后的版本才会移动到配置文件或其他容易用户编译的地方,否则,我们可以非常容易的添加我们的配置供Hibernate进行自动选择。而经常我们所使用的数据库驱动程序所取到的数据库产品名称会跟以上硬编码的不同,所以最终我们还是得自己配置数据库方言。
由于我们的系统中用到了好几个数据源,经常也是对应不同类型的数据库,并且数据源都是由容器提供的,在首次部署时经常因为数据库类型变了而忘了修改对应的数据库方言,而出了问题,这给实施人员带来了很多的不便。不过目前除了对各种数据库提供与以上硬编码相同的数据库产品名称的驱动程序外,我们就只能自己动手了。
浏览: 4209 次
来自: 广州
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'今天遇到这样的问题:
The Oracle9Dialect dialect use either Oracle9iDialect or Oracle10gDialect instead
在网上搜集了一下资料,原来是方言的问题。遂转载过来,方便以后继续学习。
Hibernate 不同数据库的连接及SQL方言
&!--MySql 驱动程序 eg. mysql-connector-java-5.0.4-bin.jar--&
&property name="dialect"&org.hibernate.dialect.MySQLDialect&/property&
&property name="connection.driver_class"&com.mysql.jdbc.Driver&/property&
&!-- JDBC URL --&
&property name="connection.url"&jdbc:mysql://localhost/dbname?characterEncoding=gb2312&/property&
&!-- 数据库用户名--&
&property name="connection.username"&root&/property&
&!-- 数据库密码--&
&property name="connection.password"&root&/property&
&!--Sql Server 驱动程序 eg. jtds-1.2.jar--&
&property name="dialect"&org.hibernate.dialect.SQLServerDialect&/property&
&property name="connection.driver_class"&net.sourceforge.jtds.jdbc.Driver&/property&
&!-- JDBC URL --&
&property name="connection.url"&jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname&/property&
&!-- 数据库用户名--&
&property name="connection.username"&sa&/property&
&!-- 数据库密码--&
&property name="connection.password"&&/property&
&!--Oracle 驱动程序 ojdbc14.jar--&
&property name="dialect"&org.hibernate.dialect.OracleDialect&/property&
&property name="connection.driver_class"&oracle.jdbc.driver.OracleDriver&/property&
&!-- JDBC URL --&
&property name="connection.url"&jdbc:oracle:thin:@localhost:1521:dbname&/property&
&!-- 数据库用户名--&
&property name="connection.username"&test&/property&
&!-- 数据库密码--&
&property name="connection.password"&test&/property&
原文网址:/plus/view-.html
如果出现如下错误,则可能是Hibernate SQL方言 (hibernate.dialect)设置不正确。
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'last_insert_id' 不是可以识别的 函数名。
org.hibernate.dialect.DB2Dialect
DB2 AS/400
org.hibernate.dialect.DB2400Dialect
org.hibernate.dialect.DB2390Dialect
PostgreSQL
org.hibernate.dialect.PostgreSQLDialect
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
org.hibernate.dialect.SybaseDialect
Sybase Anywhere
org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server
org.hibernate.dialect.SQLServerDialect
org.hibernate.dialect.SAPDBDialect
org.rmixDialect
HypersonicSQL
org.hibernate.dialect.HSQLDialect
org.hibernate.dialect.IngresDialect
org.hibernate.dialect.ProgressDialect
org.hibernate.dialect.MckoiDialect
org.hibernate.dialect.InterbaseDialect
org.hibernate.dialect.PointbaseDialect
org.hibernate.dialect.FrontbaseDialect
org.hibernate.dialect.FirebirdDialect
原文网址:/plus/view-.html
有时候,hibernate用原生SQL 查询,native SQL 的时候,会出现
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 ,-16,等等的错误
type 类型代码 可以看 java.sql.Types 中的定义,看源码就可以了
那是因为 Dialect
未定义,重写类,把未定义的Dialect 注册一下即可,
并且在 hibernate.cfg.xml中加入
&property name="hibernate.dialect"&
org.hibernate.dialect.OracleCustomDialect
&/property&
&property name="hibernate.dialect"&
org.hibernate.dialect.OracleCustomDialect
&/property&
import java.sql.T
import org.hibernate.H
public class OracleCustomDialect extends org.hibernate.dialect.Oracle10gDialect {
public OracleCustomDialect() {
registerHibernateType(Types.FLOAT, Hibernate.FLOAT.getName());
import java.sql.T
import org.hibernate.H
public class OracleCustomDialect extends org.hibernate.dialect.Oracle10gDialect {
public OracleCustomDialect() {
registerHibernateType(Types.FLOAT, Hibernate.FLOAT.getName());
这是自己解决的折中办法,最好还是遵循标准类型
在hibernate中,Oracle9Dialect 方言定义有以下代码:
public class Oracle9Dialect extends Dialect {
private static final Logger log = LoggerFactory.getLogger( Oracle9Dialect.class );
public Oracle9Dialect() {
log.warn( "The Oracle9Dialect dialect use either Oracle9iDialect or Oracle10gDialect instead" );
registerColumnType( Types.BIT, "number(1,0)" );
registerColumnType( Types.BIGINT, "number(19,0)" );
registerColumnType( Types.SMALLINT, "number(5,0)" );
registerColumnType( Types.TINYINT, "number(3,0)" );
registerColumnType( Types.INTEGER, "number(10,0)" );
registerColumnType( Types.CHAR, "char(1 char)" );
registerColumnType( Types.VARCHAR, 4000, "varchar2($l char)" );
registerColumnType( Types.VARCHAR, "long" );
registerColumnType( Types.FLOAT, "float" );
registerColumnType( Types.DOUBLE, "double precision" );
registerColumnType( Types.DATE, "date" );
registerColumnType( Types.TIME, "date" );
registerColumnType( Types.TIMESTAMP, "timestamp" );
registerColumnType( Types.VARBINARY, 2000, "raw($l)" );
registerColumnType( Types.VARBINARY, "long raw" );
registerColumnType( Types.NUMERIC, "number($p,$s)" );
registerColumnType( Types.DECIMAL, "number($p,$s)" );
registerColumnType( Types.BLOB, "blob" );
registerColumnType( Types.CLOB, "clob" );
public class Oracle9Dialect extends Dialect {
private static final Logger log = LoggerFactory.getLogger( Oracle9Dialect.class );
public Oracle9Dialect() {
log.warn( "The Oracle9Dialect dialect use either Oracle9iDialect or Oracle10gDialect instead" );
registerColumnType( Types.BIT, "number(1,0)" );
registerColumnType( Types.BIGINT, "number(19,0)" );
registerColumnType( Types.SMALLINT, "number(5,0)" );
registerColumnType( Types.TINYINT, "number(3,0)" );
registerColumnType( Types.INTEGER, "number(10,0)" );
registerColumnType( Types.CHAR, "char(1 char)" );
registerColumnType( Types.VARCHAR, 4000, "varchar2($l char)" );
registerColumnType( Types.VARCHAR, "long" );
registerColumnType( Types.FLOAT, "float" );
registerColumnType( Types.DOUBLE, "double precision" );
registerColumnType( Types.DATE, "date" );
registerColumnType( Types.TIME, "date" );
registerColumnType( Types.TIMESTAMP, "timestamp" );
registerColumnType( Types.VARBINARY, 2000, "raw($l)" );
registerColumnType( Types.VARBINARY, "long raw" );
registerColumnType( Types.NUMERIC, "number($p,$s)" );
registerColumnType( Types.DECIMAL, "number($p,$s)" );
registerColumnType( Types.BLOB, "blob" );
registerColumnType( Types.CLOB, "clob" );
而hibernate 3.3.2中 带的Oracle10gDialect方言代码如下,是继承了 Oracle9Dialect
public class Oracle10gDialect extends Oracle9iDialect {
public Oracle10gDialect() {
public JoinFragment createOuterJoinFragment() {
return new ANSIJoinFragment();
public class Oracle10gDialect extends Oracle9iDialect {
public Oracle10gDialect() {
public JoinFragment createOuterJoinFragment() {
return new ANSIJoinFragment();
同时,在public abstract class Dialect 类中,定义了以下registerHibernateType, 所有的数据库类型的Dialect都是 extends Dialect
protected Dialect() {
( "Using dialect: " + this );
sqlFunctions.putAll( STANDARD_AGGREGATE_FUNCTIONS );
// standard sql92 functions (can be overridden by subclasses)
registerFunction( "substring", new SQLFunctionTemplate( Hibernate.STRING, "substring(?1, ?2, ?3)" ) );
registerFunction( "locate", new SQLFunctionTemplate( Hibernate.INTEGER, "locate(?1, ?2, ?3)" ) );
registerFunction( "trim", new SQLFunctionTemplate( Hibernate.STRING, "trim(?1 ?2 ?3 ?4)" ) );
registerFunction( "length", new StandardSQLFunction( "length", Hibernate.INTEGER ) );
registerFunction( "bit_length", new StandardSQLFunction( "bit_length", Hibernate.INTEGER ) );
registerFunction( "coalesce", new StandardSQLFunction( "coalesce" ) );
registerFunction( "nullif", new StandardSQLFunction( "nullif" ) );
registerFunction( "abs", new StandardSQLFunction( "abs" ) );
registerFunction( "mod", new StandardSQLFunction( "mod", Hibernate.INTEGER) );
registerFunction( "sqrt", new StandardSQLFunction( "sqrt", Hibernate.DOUBLE) );
registerFunction( "upper", new StandardSQLFunction("upper") );
registerFunction( "lower", new StandardSQLFunction("lower") );
registerFunction( "cast", new CastFunction() );
registerFunction( "extract", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(?1 ?2 ?3)") );
//map second/minute/hour/day/month/year to ANSI extract(), override on subclasses
registerFunction( "second", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(second from ?1)") );
registerFunction( "minute", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(minute from ?1)") );
registerFunction( "hour", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(hour from ?1)") );
registerFunction( "day", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(day from ?1)") );
registerFunction( "month", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(month from ?1)") );
registerFunction( "year", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(year from ?1)") );
registerFunction( "str", new SQLFunctionTemplate(Hibernate.STRING, "cast(?1 as char)") );
// register hibernate types for default use in scalar sqlquery type auto detection
registerHibernateType( Types.BIGINT, Hibernate.BIG_INTEGER.getName() );
registerHibernateType( Types.BINARY, Hibernate.BINARY.getName() );
registerHibernateType( Types.BIT, Hibernate.BOOLEAN.getName() );
registerHibernateType( Types.CHAR, Hibernate.CHARACTER.getName() );
registerHibernateType( Types.DATE, Hibernate.DATE.getName() );
registerHibernateType( Types.DOUBLE, Hibernate.DOUBLE.getName() );
registerHibernateType( Types.FLOAT, Hibernate.FLOAT.getName() );
registerHibernateType( Types.INTEGER, Hibernate.INTEGER.getName() );
registerHibernateType( Types.SMALLINT, Hibernate.SHORT.getName() );
registerHibernateType( Types.TINYINT, Hibernate.BYTE.getName() );
registerHibernateType( Types.TIME, Hibernate.TIME.getName() );
registerHibernateType( Types.TIMESTAMP, Hibernate.TIMESTAMP.getName() );
registerHibernateType( Types.VARCHAR, Hibernate.STRING.getName() );
registerHibernateType( Types.VARBINARY, Hibernate.BINARY.getName() );
registerHibernateType( Types.NUMERIC, Hibernate.BIG_DECIMAL.getName() );
registerHibernateType( Types.DECIMAL, Hibernate.BIG_DECIMAL.getName() );
registerHibernateType( Types.BLOB, Hibernate.BLOB.getName() );
registerHibernateType( Types.CLOB, Hibernate.CLOB.getName() );
registerHibernateType( Types.REAL, Hibernate.FLOAT.getName() );
protected Dialect() {
</( "Using dialect: " + this );
sqlFunctions.putAll( STANDARD_AGGREGATE_FUNCTIONS );
// standard sql92 functions (can be overridden by subclasses)
registerFunction( "substring", new SQLFunctionTemplate( Hibernate.STRING, "substring(?1, ?2, ?3)" ) );
registerFunction( "locate", new SQLFunctionTemplate( Hibernate.INTEGER, "locate(?1, ?2, ?3)" ) );
registerFunction( "trim", new SQLFunctionTemplate( Hibernate.STRING, "trim(?1 ?2 ?3 ?4)" ) );
registerFunction( "length", new StandardSQLFunction( "length", Hibernate.INTEGER ) );
registerFunction( "bit_length", new StandardSQLFunction( "bit_length", Hibernate.INTEGER ) );
registerFunction( "coalesce", new StandardSQLFunction( "coalesce" ) );
registerFunction( "nullif", new StandardSQLFunction( "nullif" ) );
registerFunction( "abs", new StandardSQLFunction( "abs" ) );
registerFunction( "mod", new StandardSQLFunction( "mod", Hibernate.INTEGER) );
registerFunction( "sqrt", new StandardSQLFunction( "sqrt", Hibernate.DOUBLE) );
registerFunction( "upper", new StandardSQLFunction("upper") );
registerFunction( "lower", new StandardSQLFunction("lower") );
registerFunction( "cast", new CastFunction() );
registerFunction( "extract", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(?1 ?2 ?3)") );
//map second/minute/hour/day/month/year to ANSI extract(), override on subclasses
registerFunction( "second", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(second from ?1)") );
registerFunction( "minute", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(minute from ?1)") );
registerFunction( "hour", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(hour from ?1)") );
registerFunction( "day", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(day from ?1)") );
registerFunction( "month", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(month from ?1)") );
registerFunction( "year", new SQLFunctionTemplate(Hibernate.INTEGER, "extract(year from ?1)") );
registerFunction( "str", new SQLFunctionTemplate(Hibernate.STRING, "cast(?1 as char)") );
// register hibernate types for default use in scalar sqlquery type auto detection
registerHibernateType( Types.BIGINT, Hibernate.BIG_INTEGER.getName() );
registerHibernateType( Types.BINARY, Hibernate.BINARY.getName() );
registerHibernateType( Types.BIT, Hibernate.BOOLEAN.getName() );
registerHibernateType( Types.CHAR, Hibernate.CHARACTER.getName() );
registerHibernateType( Types.DATE, Hibernate.DATE.getName() );
registerHibernateType( Types.DOUBLE, Hibernate.DOUBLE.getName() );
registerHibernateType( Types.FLOAT, Hibernate.FLOAT.getName() );
registerHibernateType( Types.INTEGER, Hibernate.INTEGER.getName() );
registerHibernateType( Types.SMALLINT, Hibernate.SHORT.getName() );
registerHibernateType( Types.TINYINT, Hibernate.BYTE.getName() );
registerHibernateType( Types.TIME, Hibernate.TIME.getName() );
registerHibernateType( Types.TIMESTAMP, Hibernate.TIMESTAMP.getName() );
registerHibernateType( Types.VARCHAR, Hibernate.STRING.getName() );
registerHibernateType( Types.VARBINARY, Hibernate.BINARY.getName() );
registerHibernateType( Types.NUMERIC, Hibernate.BIG_DECIMAL.getName() );
registerHibernateType( Types.DECIMAL, Hibernate.BIG_DECIMAL.getName() );
registerHibernateType( Types.BLOB, Hibernate.BLOB.getName() );
registerHibernateType( Types.CLOB, Hibernate.CLOB.getName() );
registerHibernateType( Types.REAL, Hibernate.FLOAT.getName() );
如果有特殊类型确实需要,只能自定义。
所以oracle的类型定义最好遵循以上的 java.sql.Types,
在hibernate.cfg.xml中使用 org.hibernate.dialect.OracleCustomDialect
以防出现No Dialect mapping for JDBC type错误
其他的 数据库类型,SQL SERVER
DB2 MYSQL 等等,都可以查看 hibernate的相关源码找出个所以然来
原文网址:/plus/view-.html
浏览: 185288 次
来自: 西安
这个东西是不是只能当做一个插件来使用?不能自定义方法,我试了很 ...
这里推荐数据怎么生成的没有写呢
你错了产生真个原因是死锁造成的很有可能Tomcat中项目使用了 ...
不错,有参考价值,谢谢总结
不错不错老夫先撸为敬,众撸友随意
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'在Hibernate中,关于数据库的方言有什么作用
全部答案(共1个回答)
都有不同的语言 主要是对数据库语言使用的选择
1.下载HibernateTools-3.2.4插件
2.在myeclipse安装路径中找到dropins文件夹 在里面写个HibernateTool.link...
Hibernate最大的好处就是跨数据库的使用
这样你只要更改下配置文件
说明是连接那种数据库就可以了
而SQL语句是不用进行更改的
例如MSSQL下开发的东西...
小腹,估计是房事过频之故,注意节制就没事了。祝你如意。
org.hibernate.dialect.SQLServerDialect
com.microsoft.sqlserver.jdbc.SQLServerD...
我也是计算机专业的,你一定想去发展又怕以后走错路吧!你学习一定要专才会有美好的前途呀!!!我们公司的高手都非常能干,当然你的实力就代表你的工资级别啦!你越有这方...
答: 十二周做的nt的数据中如何看男女?
答: 我想先说一句不太好听的话,你可能对数据库的接触还刚开始吧.
呵呵,首先,文件夹是系统目录下的东西,是操作系统内部的东西,和数据库没有直接的关系.所以这是一个定位...
答: 能说详细点吗?服务器在哪,sql服务器在哪
你是使用别人的服务器吗,还是应用程序自带的数据库?
如果是本地数据库,可能要单独安装启动数据库,具体看软件说明
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415相关文章推荐
hibernate.dialect
RDBMS 方言
org.hibernate.dialect.DB2Dialect
DB2 AS/400...
在配置hibernate.cfg.xml时需指定使用数据库的方言:
name="dialect">org.hibernate.dialect.MySQL5Dialect...
Hibernate就相当于一个翻译,配置“方言”选项,就是告诉Hibernate它要说哪里的言。是这样的,因为不同的数据库,在Sql语句的设计上是存在差异的,就好比不同地方的人说不同的方言。而Hibe...
Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系型数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异,因此Hibernate需...
在开发hibernate的程序时,需要进行SessionFactory的配置,简单地说,也就是建立与数据库之间连接的配置,在hibernate中一般使用xml文件来进行配置,但是在该文件的配置中需要设...
org.hibernate.dialect.DB2Dialect
DB2 AS/400
org.hibernate.dialect.DB24...
在hibernate3.jar包里面,在org.hibernate.dialect包里面。
常见的有:
org.hibernate.dialect.SQLServerDialect
org.hiber...
Hibernate SQL 方言(hibernate.dialect)
org.hibernate.dialec...
Hibernate SQL方言 (hibernate.dialect) Spring配置文件applicationContext.xml
Hibernate SQL方言 (hiber...
Oracle 11.2.0 XE
Hibernate4.x
Hibernate.cfg.xml中方言的配置:
org.hibernate.dialect.Oracle...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Hibernate不同数据库 方言|驱动|url 配置
来源:博客园
Hibernate不同数据库方言|驱动|url mySql : hibernate.dialect : org.hibernate.dialect.MySQLDialect driverClassName : com.mysql.jdbc.Driver url : jdbc:mysql://IP地址/数据库名称?characterEncoding=gb2312 oracle : hibernate.dialect : org.hibernate.dialect.OracleDialect driverClassName : oracle.jdbc.driver.OracleDriver url : jdbc:oracle:thin:@IP地址:1521:数据库名称 sqlServer : hibernate.dialect : org.hibernate.dialect.SQLServerDialect driverClassName : net.sourceforge.jtds.jdbc.Driver url : jdbc:jtds:sqlserver://IP地址:1433;DatabaseName=数据库名称
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 hibernate的方言 的文章

 

随机推荐