[Solved] ‘hibernate.dialect’が設定されていないときには、DialectResolutionInfoへのアクセスはnullであってはならないので、HibernateExceptionが発生しました。

私は、Hibernateの公式ドキュメントに従ってバージョン4.3.5.Finalを使用して基本的なHibernateアプリケーションを作成していました。アプリケーションを実行したところ、hibernate.HibernateException: ‘hibernate.dialect’が設定されていない場合にはDialectResolutionInfoにアクセスできませんというエラーが発生しましたが、すべての設定が正しく見えました。

HibernateException: ‘hibernate.dialect’が設定されていない場合、DialectResolutionInfoへのアクセスはnullであってはなりません。

問題の解決には長い時間がかかりましたが、SessionFactoryのインスタンス作成方法に問題があることが判明しました。私のセッションファクトリインスタンスを作成するためのユーティリティクラスは以下のようなものでした。

package com.scdev.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.scdev.hibernate.main.HibernateMain.main(HibernateMain.java:38)

ログからは、Configurationクラスがヒベルネートの設定ファイルを見つけ、ヒベルネートの方言が定義されていることが明らかであり、したがって例外が意味をなしていないことがわかる。

「hibernate.dialect」が設定されていない場合、HibernateException: DialectResolutionInfoへのアクセスはnullにできませんの修正方法。

調査とデバッグを行った後、私はそれを修正することができました。公式ドキュメントに欠けている部分は、設定プロパティをStandardServiceRegistryBuilderに適用する必要があることです。以下のユーティリティクラスを変更したところ、すべてがうまく動作しました。

package com.scdev.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はまだ進化しているため、各バージョンには多くの変更があります。ドキュメントの部分が追いついていないと感じています。誰かが問題を修正するのに役立つことを願っています。たくさんの時間をデバッグに費やす代わりに。

コメントを残す 0

Your email address will not be published. Required fields are marked *