Hibernate 不同数据库的连接及SQL方言

来源:互联网 发布:pathfinder软件价格 编辑:程序博客网 时间:2024/04/26 02:51
<!--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>



如果出现如下错误,则可能是Hibernate SQL方言 (hibernate.dialect)设置不正确。
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'last_insert_id' 不是可以识别的 函数名。

RDBMS 方言DB2org.hibernate.dialect.DB2DialectDB2 AS/400org.hibernate.dialect.DB2400DialectDB2 OS390org.hibernate.dialect.DB2390DialectPostgreSQLorg.hibernate.dialect.PostgreSQLDialectMySQLorg.hibernate.dialect.MySQLDialectMySQL with InnoDBorg.hibernate.dialect.MySQLInnoDBDialectMySQL with MyISAMorg.hibernate.dialect.MySQLMyISAMDialectOracle (any version)org.hibernate.dialect.OracleDialectOracle 9i/10gorg.hibernate.dialect.Oracle9DialectSybaseorg.hibernate.dialect.SybaseDialectSybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialectMicrosoft SQL Serverorg.hibernate.dialect.SQLServerDialectSAP DBorg.hibernate.dialect.SAPDBDialectInformixorg.hibernate.dialect.InformixDialectHypersonicSQLorg.hibernate.dialect.HSQLDialectIngresorg.hibernate.dialect.IngresDialectProgressorg.hibernate.dialect.ProgressDialectMckoi SQLorg.hibernate.dialect.MckoiDialectInterbaseorg.hibernate.dialect.InterbaseDialectPointbaseorg.hibernate.dialect.PointbaseDialectFrontBaseorg.hibernate.dialect.FrontbaseDialectFirebirdorg.hibernate.dialect.FirebirdDialect
以上是转载来的
///////////////////////////////////////////////////////////////////////////////////////////
有时候,hibernate用原生SQL 查询,native SQL 的时候,会出现
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 ,-16,等等的错误
type 类型代码 可以看 java.sql.Types 中的定义,看源码就可以了

那是因为 Dialect  未定义,重写类,把未定义的Dialect 注册一下即可,
并且在 hibernate.cfg.xml中加入
Xml代码  收藏代码
  1. <property name="hibernate.dialect">  
  2.     org.hibernate.dialect.OracleCustomDialect  
  3. </property>  


Java代码  收藏代码
  1. import java.sql.Types;  
  2.   
  3. import org.hibernate.Hibernate;  
  4.   
  5. public class OracleCustomDialect extends org.hibernate.dialect.Oracle10gDialect {  
  6.   
  7.     public OracleCustomDialect() {  
  8.         super();  
  9.         registerHibernateType(Types.FLOAT, Hibernate.FLOAT.getName());  
  10.     }  
  11. }  
 
这是自己解决的折中办法,最好还是遵循标准类型
在hibernate中,Oracle9Dialect 方言定义有以下代码:
Java代码  收藏代码
  1. public class Oracle9Dialect extends Dialect {  
  2.   
  3.     private static final Logger log = LoggerFactory.getLogger( Oracle9Dialect.class );  
  4.   
  5.     public Oracle9Dialect() {  
  6.         super();  
  7.         log.warn( "The Oracle9Dialect dialect has been deprecated; use either Oracle9iDialect or Oracle10gDialect instead" );  
  8.         registerColumnType( Types.BIT, "number(1,0)" );  
  9.         registerColumnType( Types.BIGINT, "number(19,0)" );  
  10.         registerColumnType( Types.SMALLINT, "number(5,0)" );  
  11.         registerColumnType( Types.TINYINT, "number(3,0)" );  
  12.         registerColumnType( Types.INTEGER, "number(10,0)" );  
  13.         registerColumnType( Types.CHAR, "char(1 char)" );  
  14.         registerColumnType( Types.VARCHAR, 4000"varchar2($l char)" );  
  15.         registerColumnType( Types.VARCHAR, "long" );  
  16.         registerColumnType( Types.FLOAT, "float" );  
  17.         registerColumnType( Types.DOUBLE, "double precision" );  
  18.         registerColumnType( Types.DATE, "date" );  
  19.         registerColumnType( Types.TIME, "date" );  
  20.         registerColumnType( Types.TIMESTAMP, "timestamp" );  
  21.         registerColumnType( Types.VARBINARY, 2000"raw($l)" );  
  22.         registerColumnType( Types.VARBINARY, "long raw" );  
  23.         registerColumnType( Types.NUMERIC, "number($p,$s)" );  
  24.         registerColumnType( Types.DECIMAL, "number($p,$s)" );  
  25.         registerColumnType( Types.BLOB, "blob" );  
  26.         registerColumnType( Types.CLOB, "clob" );  
  27.   
  28. ……  
  29. ……  
 
而hibernate 3.3.2中 带的Oracle10gDialect方言代码如下,是继承了 Oracle9Dialect
Java代码  收藏代码
  1. public class Oracle10gDialect extends Oracle9iDialect {  
  2.   
  3.     public Oracle10gDialect() {  
  4.         super();  
  5.     }  
  6.   
  7.     public JoinFragment createOuterJoinFragment() {  
  8.         return new ANSIJoinFragment();  
  9.     }  
  10. }  
 
同时,在public abstract class Dialect 类中,定义了以下registerHibernateType, 所有的数据库类型的Dialect都是 extends Dialect
Java代码  收藏代码
  1. protected Dialect() {  
  2.     log.info( "Using dialect: " + this );  
  3.     sqlFunctions.putAll( STANDARD_AGGREGATE_FUNCTIONS );  
  4.   
  5.     // standard sql92 functions (can be overridden by subclasses)  
  6.     registerFunction( "substring"new SQLFunctionTemplate( Hibernate.STRING, "substring(?1, ?2, ?3)" ) );  
  7.     registerFunction( "locate"new SQLFunctionTemplate( Hibernate.INTEGER, "locate(?1, ?2, ?3)" ) );  
  8.     registerFunction( "trim"new SQLFunctionTemplate( Hibernate.STRING, "trim(?1 ?2 ?3 ?4)" ) );  
  9.     registerFunction( "length"new StandardSQLFunction( "length", Hibernate.INTEGER ) );  
  10.     registerFunction( "bit_length"new StandardSQLFunction( "bit_length", Hibernate.INTEGER ) );  
  11.     registerFunction( "coalesce"new StandardSQLFunction( "coalesce" ) );  
  12.     registerFunction( "nullif"new StandardSQLFunction( "nullif" ) );  
  13.     registerFunction( "abs"new StandardSQLFunction( "abs" ) );  
  14.     registerFunction( "mod"new StandardSQLFunction( "mod", Hibernate.INTEGER) );  
  15.     registerFunction( "sqrt"new StandardSQLFunction( "sqrt", Hibernate.DOUBLE) );  
  16.     registerFunction( "upper"new StandardSQLFunction("upper") );  
  17.     registerFunction( "lower"new StandardSQLFunction("lower") );  
  18.     registerFunction( "cast"new CastFunction() );  
  19.     registerFunction( "extract"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(?1 ?2 ?3)") );  
  20.   
  21.     //map second/minute/hour/day/month/year to ANSI extract(), override on subclasses  
  22.     registerFunction( "second"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(second from ?1)") );  
  23.     registerFunction( "minute"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(minute from ?1)") );  
  24.     registerFunction( "hour"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(hour from ?1)") );  
  25.     registerFunction( "day"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(day from ?1)") );  
  26.     registerFunction( "month"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(month from ?1)") );  
  27.     registerFunction( "year"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(year from ?1)") );  
  28.   
  29.     registerFunction( "str"new SQLFunctionTemplate(Hibernate.STRING, "cast(?1 as char)") );  
  30.   
  31.        // register hibernate types for default use in scalar sqlquery type auto detection  
  32.     registerHibernateType( Types.BIGINT, Hibernate.BIG_INTEGER.getName() );  
  33.     registerHibernateType( Types.BINARY, Hibernate.BINARY.getName() );  
  34.     registerHibernateType( Types.BIT, Hibernate.BOOLEAN.getName() );  
  35.     registerHibernateType( Types.CHAR, Hibernate.CHARACTER.getName() );  
  36.     registerHibernateType( Types.DATE, Hibernate.DATE.getName() );  
  37.     registerHibernateType( Types.DOUBLE, Hibernate.DOUBLE.getName() );  
  38.     registerHibernateType( Types.FLOAT, Hibernate.FLOAT.getName() );  
  39.     registerHibernateType( Types.INTEGER, Hibernate.INTEGER.getName() );  
  40.     registerHibernateType( Types.SMALLINT, Hibernate.SHORT.getName() );  
  41.     registerHibernateType( Types.TINYINT, Hibernate.BYTE.getName() );  
  42.     registerHibernateType( Types.TIME, Hibernate.TIME.getName() );  
  43.     registerHibernateType( Types.TIMESTAMP, Hibernate.TIMESTAMP.getName() );  
  44.     registerHibernateType( Types.VARCHAR, Hibernate.STRING.getName() );  
  45.     registerHibernateType( Types.VARBINARY, Hibernate.BINARY.getName() );  
  46.     registerHibernateType( Types.NUMERIC, Hibernate.BIG_DECIMAL.getName() );  
  47.     registerHibernateType( Types.DECIMAL, Hibernate.BIG_DECIMAL.getName() );  
  48.     registerHibernateType( Types.BLOB, Hibernate.BLOB.getName() );  
  49.     registerHibernateType( Types.CLOB, Hibernate.CLOB.getName() );  
  50.     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的相关源码找出个所以然来
这里就不贴出相关源码了。。。
0 0
原创粉丝点击