一尘不染

在我的应用程序中在哪里打开和在哪里关闭SessionFactory

hibernate

我正在开发jsf应用程序,并使用hibernate模式作为后端。我想创建会话工厂,并在整个应用程序中关闭它。我正在使用util类创建Session工厂。

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil
{
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

static
{
    try
    {
        Configuration configuration = new Configuration().configure();

        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    }
    catch (HibernateException he)
    {
        System.err.println("Error creating Session: " + he);
        throw new ExceptionInInitializerError(he);
    }
}

public static SessionFactory getSessionFactory()
{
    return sessionFactory;
} 
}

 public static void closeFactory() {
    if (sessionFactory != null) {
        try {
            sessionFactory.close();
        } catch (HibernateException ignored) {
            log.error("Couldn't close SessionFactory", ignored);
        }
    }
}

在我的DAO类的每种方法中,我都会打开会话工厂并关闭它。因此,在我只能打开/关闭会话工厂一次的应用程序中。提前致谢。


阅读 279

收藏
2020-06-20

共1个答案

一尘不染

在我的应用程序中在哪里打开和在哪里关闭SessionFactory

您正在使用单例会话工厂对象。因此,您可以使用类名称调用getSessionFactory()方法。因此您确实需要每次为会话工厂创建对象。

您的DAO类方法应如下所示

DAO类中的方法

public boolean createUser(NewUserDTO newUserDTO) {
    try {
        sessionFactory = DBUtils.getSessionFactory();
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
        session.save(newUserDTO);
        session.getTransaction().commit();
    } catch (RuntimeException runtimeException) {
        LOGGER.error(runtimeException);
        transaction.rollback();
        return false;
    } finally {
        if (session != null) {
            session.close();
        }
    }
    return true;
}

并且必须为每种方法关闭会话。这样就不会为每个类都创建会话工厂。

2020-06-20