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"调用。