[Решено] HibernateException: доступ к DialectResolutionInfo не может быть нулевым, если «hibernate.dialect» не установлен
Я следил за официальной документацией Hibernate, чтобы создать базовое приложение для гибернации с версией 4.3.5.Final. Когда я выполнил приложение, я получил hibernate.HibernateException: доступ к DialectResolutionInfo не может быть нулевым, если hibernate.dialect не установлен
, хотя вся конфигурация мне показалась нормальной.
HibernateException: доступ к DialectResolutionInfo не может быть нулевым, если «hibernate.dialect» не установлен
Мне потребовалось много времени, чтобы решить проблему, и оказалось, что это связано с тем, как создавался экземпляр SessionFactory
. Мой служебный класс для создания экземпляра SessionFactory был таким, как показано ниже.
package com.journaldev.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;
}
}
И я получал следующую трассировку стека:
May 07, 2014 7:11:59 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
May 07, 2014 7:12:00 PM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: employee.hbm.xml
May 07, 2014 7:12:00 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
May 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.journaldev.hibernate.main.HibernateMain.main(HibernateMain.java:38)
Из журналов видно, что класс конфигурации смог найти исключение, не имеющее никакого смысла.
Исправление для HibernateException: доступ к DialectResolutionInfo не может быть нулевым, если «hibernate.dialect» не установлен
После некоторых исследований и отладки я смог это исправить. Часть, которая отсутствует в официальной документации, заключается в том, что нам нужно применить свойства конфигурации к StandardServiceRegistryBuilder
. Когда я изменил класс утилиты ниже, все заработало как шарм.
package com.journaldev.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
, в котором передаются свойства конфигурации. Hibernate все еще развивается, и каждая версия содержит множество изменений, и я чувствую, что часть документации отстает. Я надеюсь, что это поможет кому-то решить проблему, а не тратить много времени на отладку.