All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.easyproject.easycommons.commondao.factory.HibernateSessionFactory Maven / Gradle / Ivy

package cn.easyproject.easycommons.commondao.factory;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

/**
 * EasyCommonDAO HibernateSessionFactory
 * Configures and provides access to Hibernate sessions, tied to the
 * current thread of execution.  Follows the Thread Local Session
 * pattern.
 * 
 * @author Ray
 * @author [email protected]
 * @author easyproject.cn
 * @since 1.0.0
 */
public class HibernateSessionFactory {

    /** 
     * Location of hibernate.cfg.xml file.
     * Location should be on the classpath as Hibernate uses  
     * #resourceAsStream style lookup for its configuration file. 
     * The default classpath location of the hibernate config file is 
     * in the default package. Use #setConfigFile() to update 
     * the location of the configuration file for the current session.   
     */
	private static final ThreadLocal threadLocal = new ThreadLocal();
    private static SessionFactory sessionFactory;
    private static final String CONFIGURATION_FILE="hibernate.cfg.xml";

	static {
    	try {
			//Hibernate 5.X
			// 注册配置文件
			 StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
					.configure(CONFIGURATION_FILE) // configures settings from hibernate.cfg.xml
					.build();
			
			try {
				sessionFactory = new MetadataSources( standardRegistry ).buildMetadata().buildSessionFactory();
			}catch (Exception e) {
				e.printStackTrace();
				// 手动销毁registry
				StandardServiceRegistryBuilder.destroy( standardRegistry );
			}
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
    }
    private HibernateSessionFactory() {
    }
	
    /**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the SessionFactory if needed.
     * 
     * @return Session
     * @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}

        return session;
    }

	/**
     *  Rebuild hibernate session factory
     *
     */
	public static void rebuildSessionFactory() {
		try {
			// 注册配置文件
			 StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
					.configure("hibernate.cfg.xml") // configures settings from hibernate.cfg.xml
					.build();
			
			try {
				sessionFactory = new MetadataSources( standardRegistry ).buildMetadata().buildSessionFactory();
			}catch (Exception e) {
				e.printStackTrace();
				// 手动销毁registry
				StandardServiceRegistryBuilder.destroy( standardRegistry );
			}
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}

	/**
     *  Close the single hibernate session instance.
     *
     *  @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

	/**
* @return session factory
     *
     */
	public static org.hibernate.SessionFactory getSessionFactory() {
		return sessionFactory;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy