Hibernate 之dialect(数据库方言)小谈

如果一个系统可能运行于多种数据库,或者同时使用多种数据库,那么,使用Hibernate将会给你带来很多的方便,想信很多接触Hibernate的人都会体会到。Hibernate底层是通过dialect包来对各种数据库的差异进行抽象的。Dialect类中实现每种数据库相同的东西,而不同数据库对应会有该类的一个扩展实现,最终通过DialectFactory来决定创建哪一个类。通常我们都会指定hibernate.dialect属性,那直接创建该属性对应的类。如果我们没有指定该属性,那么由Hibernate自己决定选择合适的方言。在DialectFactory中初始化各种数据库对应的方言的Map,以数据库产品名为key,以方言的包装对象为value。Hibernate自动选择方言时,会通过JDBC的DatabaseMetadata取得数据库的产品名称,根据名称取得对应的方言。DialectFactory中对该Map的初始化的部分代码如下:
Java代码
// TODO : this is the stuff it'd be nice to move to a properties file or some other easily user-editable place
  
  1.     private static final Map MAPPERS = new HashMap();   
  2.     static {   
  3.         // detectors...   
  4.         MAPPERS.put( "HSQL Database Engine"new VersionInsensitiveMapper( "org.hibernate.dialect.HSQLDialect" ) );   
  5.         MAPPERS.put( "H2"new VersionInsensitiveMapper( "org.hibernate.dialect.H2Dialect" ) );   
  6.         MAPPERS.put( "MySQL"new VersionInsensitiveMapper( "org.hibernate.dialect.MySQLDialect" ) );   
  7.         MAPPERS.put( "PostgreSQL"new VersionInsensitiveMapper( "org.hibernate.dialect.PostgreSQLDialect" ) );   
  8.         MAPPERS.put( "Apache Derby"new VersionInsensitiveMapper( "org.hibernate.dialect.DerbyDialect" ) );   
  9. ...  
    原本上,这种自动选择的方式,会给我们带来方便,只可惜,从以上的代码的注释中可以知道,目前这一部分的初始化是通过硬编码的,只有在以后的版本才会移动到配置文件或其他容易用户编译的地方,否则,我们可以非常容易的添加我们的配置供Hibernate进行自动选择。而经常我们所使用的数据库驱动程序所取到的数据库产品名称会跟以上硬编码的不同,所以最终我们还是得自己配置数据库方言。

   由于我们的系统中用到了好几个数据源,经常也是对应不同类型的数据库,并且数据源都是由容器提供的,在首次部署时经常因为数据库类型变了而忘了修改对应的数据库方言,而出了问题,这给实施人员带来了很多的不便。不过目前除了对各种数据库提供与以上硬编码相同的数据库产品名称的驱动程序外,我们就只能自己动手了。


你可能感兴趣的:(Hibernate,java之基础部分)