org.hibernate HibernateException Dialect must be explicitly set :*** 
使用Hibernate,有时候会遇到类似上面的异常。 
使用代码获取Session是要使用Configuration要调用Configure方法。这个方法很容易被遗忘。
 
SessionFactory sf=config.configure().buildSessionFactory(); Session session=sf.openSession();

通过API可以知道configure()方法的作用如下:

Use the mappings and properties specified in an application resource named hibernate.cfg.xml
configure()方法默认加载hibernate.cfg.xml文件,使该文件的映射和配置在应用程序中使用;configure()还有重载的方法来指定配置分别是
 configure(Document document)
configure(File configFile)
configure(String resource)
configure(URL url)

  

若使用configure方法那么就可以在hibernate.cfg.xml中配置数据库的dialect:
      

<property name="dialect">数据库对应的dialect</property>
通过配置来指定数据库对于的的dialect,具体的数据库和数据库对于的dialect如下:
 
 
RDBMS Dialect
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/10g org.hibernate.dialect.Oracle9Dialect
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
 
 
使用spring和hibernate时如果使用时,有时候会去掉hibernate.cfg.xml,那么则要在Spring中配置dialect
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.format_sql">true</prop>
<!-- 配置hibernate.dialect-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>
</props>
</property>

  

 
 
通过Hibernate Reference 可以知道,Dialect这部分内容使和数据库的移植性有相关的,在3.2之前的版本,Hibernate是要求用户明确指定数据库的Dialect的,3.2或以上版本通过java.sql.DataBaseMetaData来确定数据库;不过该文档同时指出来这种方法局限于Hibernate已知的数据库且无法进行配置和覆盖。3.3以后,用户可以通过重写org.hibernate.resolver.DialectResolver的resolveDialect方法来自定义方言,“要注册一个或多个解析者,只要用 'hibernate.dialect_resolvers' 配置设置指定它们(由逗号、制表符或空格隔开)就可以了(请参考 org.hibernate.cfg.Environment 上的 DIALECT_RESOLVERS)”。
用户定义的类通过AvailableSettings.DIALECT_RESOLVERS 获取类名,然后通过反射来注册DialectResolver。AvailableSettings.DIALECT_RESOLVERS 配置的类在determineResolvers链上先于StandardDialectResolver,所以自定义的解释者更优先处理DatabaseMetaData。
以下使hibernate初始化DialectResolver链的类。
import org.hibernate.HibernateException;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.service.classloading.spi.ClassLoaderService;
import org.hibernate.service.spi.ServiceException;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.jdbc.dialect.spi.DialectResolver;
import org.hibernate.service.spi.BasicServiceInitiator; /**
* Standard initiator for the standard {@link DialectResolver} service
*
* @author Steve Ebersole
*/
public class DialectResolverInitiator implements BasicServiceInitiator<DialectResolver> {
public static final DialectResolverInitiator INSTANCE = new DialectResolverInitiator(); @Override
public Class<DialectResolver> getServiceInitiated() {
return DialectResolver.class;
} @Override
public DialectResolver initiateService(Map configurationValues, ServiceRegistryImplementor registry) {
return new DialectResolverSet( determineResolvers( configurationValues, registry ) );
} private List<DialectResolver> determineResolvers(Map configurationValues, ServiceRegistryImplementor registry) {
final List<DialectResolver> resolvers = new ArrayList
(); final String resolverImplNames = (String) configurationValues.get( AvailableSettings.DIALECT_RESOLVERS ); if ( StringHelper.isNotEmpty( resolverImplNames ) ) {
final ClassLoaderService classLoaderService = registry.getService( ClassLoaderService.class );
for ( String resolverImplName : StringHelper.split( ", \n\r\f\t", resolverImplNames ) ) {
try {
resolvers.add( (DialectResolver) classLoaderService.classForName( resolverImplName ).newInstance() );
}
catch (HibernateException e) {
throw e;
}
catch (Exception e) {
throw new ServiceException( "Unable to instantiate named dialect resolver [" + resolverImplName + "]", e );
}
}
} resolvers.add( new StandardDialectResolver() );
return resolvers;
}
}
 

关于Hibernate的Dialect的更多相关文章

  1. Hibernate SQL Dialect 方言

    RDBMS Dialect DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB ...

  2. Hibernate 的dialect 大全

    RDBMS 方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS3 ...

  3. Hibernate的dialect大全

    RDBMS 方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS3 ...

  4. hibernate中dialect的讲解

    RDBMS方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS39 ...

  5. 【Hibernate】Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

    今天用hibernate框架写crm项目时遇到报错: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' n ...

  6. Hibernate工作原理

    现在我们知道了一个概念Hibernate Session,只有处于Session管理下的POJO才具有持久化操作能力.当应用程序对于处于Session管理下的POJO实例执行操作时,Hibernate ...

  7. [转]Hibernate不能自动建表解决办法及Hibernate不同数据库的连接及SQL方言

    最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...

  8. 让Hibernate生成的DDL脚本自动增加注释

    我们知道可以通过Hibernate对象自动生成DDL建表语句,通过PowerDesigner工具可以反向工程生成数据字典,但是在生成的DDL中一直不能写上中文的注释,这就使我们生成的数据字典不具有可用 ...

  9. hibernate 对 sql server 2005 分页改进

    Hibernate 可以实现分页查询 如下 Query q = session.createQuery("from Cat as c"); q.setFirstResult(100 ...

随机推荐

  1. 卷积神经网络_(4)_caffe简介

    这里大致说一下caffe.caffe是伯里克利大学的贾杨清教授写的一个深度学习框架,使用C++编写的,但同时也提供python和matlab接口:组成部分主要有: (1)Blob:用来存储数据和梯度: ...

  2. QQ聊天界面模式切换

    1.打开一个聊天窗口 2.按照图上步骤 3.模式 3-1气泡模式 3-2文本模式

  3. Wakez计算与压缩的思考

    大部分人认为,比尔盖茨在1981年说过这样一句话:640K ought to be enough for anybody.(640个kB对任何人来说都应该足够了).不过后来比尔盖茨否认自己说过这句话. ...

  4. [Android Pro] 完美Android Cursor使用例子(Android数据库操作)

    reference to : http://www.ablanxue.com/prone_10575_1.html 完美 Android Cursor使用例子(Android数据库操作),Androi ...

  5. useradd与adduser的区别

    useradd与adduser都是创建新的用户 在CentOs下useradd与adduser是没有区别的都是在创建用户,在home下自动创建目录,没有设置密码,需要使用passwd命令修改密码. 而 ...

  6. 解决CURL 请求本地超时

    首先,这样的问题只会出现在Windows+Nginx中. php-cgi 默认使用的是9000端口,即使多个进程也并发的是9000端口 在用户访问一个php页面的时候nginx已将该进程占用,在该进程 ...

  7. ExtJs基础知识总结:自定义弹窗和ComboBox自动联想加载(四)

    概述 Extjs弹窗可以分为消息弹窗.对话框,这些弹窗的方式ExtJs自带的Ext.Msg.alert就已经可以满足简单消息提示,但是相对复杂的提示,比如如何将Ext.grid.Panel的控件显示嵌 ...

  8. hosts文件权限导致监听无法启动

    1.所属系统:2.问题描述:3.解决4.参考???疑点:为什么修改主机名会使hosts文件权限发生改变 1.所属系统: ZHJS2#[/]uname -a HP-UX ZHJS2 B.11.31 U ...

  9. 移动端webapp自适应实践(css雪碧图制作小工具实践)图文并茂

    为什么要写这个 以前写过关于webapp自适应屏幕的文章(链接),不过写的大多数群众看不懂,所以来个图文并茂的版本.虽然只是一个简单的页面,不过在做的过程中也遇到了一些问题,也算是好事吧! 该示例gi ...

  10. WM_COPYDATA实现的不同进程间通信

    进程间通信,通过SendMessage向另一进程发送WM_COPYDATA消息,实现不同进程间的消息通信. 需求:已写好一个工具软件,想在不更改当前的软件开发的前提下,实现为后面新开发的软件提供数据推 ...