웹사이트 검색

[해결됨] HibernateException: 'hibernate.dialect'가 설정되지 않은 경우 DialectResolutionInfo에 대한 액세스가 null일 수 없습니다.


버전 4.3.5.Final로 기본 hibernate 애플리케이션을 생성하기 위해 Hibernate 공식 문서를 따르고 있었습니다. 응용 프로그램을 실행할 때 모든 구성이 괜찮아 보였지만 hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when hibernate.dialect not set가 발생했습니다.

HibernateException: 'hibernate.dialect'가 설정되지 않은 경우 DialectResolutionInfo에 대한 액세스는 null일 수 없습니다.

문제를 해결하는 데 오랜 시간이 걸렸고 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)

로그에서 Configuration 클래스가 예외를 찾을 수 있었음이 분명합니다.

HibernateException 수정: 'hibernate.dialect'가 설정되지 않은 경우 DialectResolutionInfo에 대한 액세스가 null일 수 없음

몇 가지 연구와 디버깅을 거쳐 고칠 수 있었습니다. 공식 문서에서 누락된 부분은 구성 속성을 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는 여전히 진화하고 있으며 모든 버전에는 많은 변경 사항이 있으며 문서화 부분이 뒤쳐져 있다고 생각합니다. 디버깅에 많은 시간을 낭비하지 않고 누군가가 문제를 해결하는 데 도움이 되기를 바랍니다.