HibernateException:未设置" hibernate.dialect"时,对DialectResolutionInfo的访问不能为null

时间:2020-02-23 14:41:27  来源:igfitidea点击:

我正在遵循Hibernate官方文档来创建基本的Hibernate应用程序,版本为4.3.5.Final。
当我执行应用程序时,报错:

hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

HibernateException:如果未设置" hibernate.dialect",则对DialectResolutionInfo的访问不能为null

我花了很长时间解决这个问题,事实证明是通过创建SessionFactory实例的方式实现的。

我的创建SessionFactory实例的实用程序类如下。

package com.theitroad.hibernate.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class SessionFactoryUtil {

	private static SessionFactory sessionFactory;
	
	private static SessionFactory buildSessionFactory() {
      try {
          //Create the SessionFactory from hibernate.cfg.xml
     	SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml")
      				.buildSessionFactory(new StandardServiceRegistryBuilder().build());
      	
          return sessionFactory;
      }
      catch (Throwable ex) {
          //Make sure you log the exception, as it might be swallowed
          System.err.println("Initial SessionFactory creation failed." + ex);
          throw new ExceptionInInitializerError(ex);
      }
  }
	
	public static SessionFactory getSessionFactory() {
		if(sessionFactory == null) sessionFactory = buildSessionFactory();
      return sessionFactory;
  }
}

而且我得到以下堆栈跟踪:

Jan 07, 2014 7:11:59 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
Jan 07, 2014 7:12:00 PM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: employee.hbm.xml
Jan 07, 2014 7:12:00 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Jan 07, 2014 7:12:00 PM org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService
WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections
Initial SessionFactory creation failed.org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
Exception in thread "main" java.lang.NullPointerException
	at com.theitroad.hibernate.main.HibernateMain.main(HibernateMain.java:38)

从日志中可以清楚地看到Configuration类能够找到Hibernate 配置文件,并且定义了" hibernate.dialect",因此该异常毫无意义。

修复 hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

经过一些研究和调试,我能够修复它。
官方文档中缺少的部分是我们需要将配置属性应用于" StandardServiceRegistryBuilder"。

当我将实用程序类更改为以下内容时,所有内容都像一个魅力。

package com.theitroad.hibernate.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class SessionFactoryUtil {

	private static SessionFactory sessionFactory;
	
	private static SessionFactory buildSessionFactory() {
      try {
          //Create the SessionFactory from hibernate.cfg.xml
      	Configuration configuration = new Configuration();
      	configuration.configure("hibernate.cfg.xml");
      	System.out.println("Hibernate Configuration loaded");
      	
      	//apply configuration property settings to StandardServiceRegistryBuilder
      	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
      	System.out.println("Hibernate serviceRegistry created");
      	
      	SessionFactory sessionFactory = configuration
      						.buildSessionFactory(serviceRegistry);
      	
          return sessionFactory;
      }
      catch (Throwable ex) {
          //Make sure you log the exception, as it might be swallowed
          System.err.println("Initial SessionFactory creation failed." + ex);
          throw new ExceptionInInitializerError(ex);
      }
  }
	
	public static SessionFactory getSessionFactory() {
		if(sessionFactory == null) sessionFactory = buildSessionFactory();
      return sessionFactory;
  }
}

请注意传递配置属性的" StandardServiceRegistryBuilder().applySettings"调用。