我正在开发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类的每种方法中,我都会打开会话工厂并关闭它。因此,在我只能打开/关闭会话工厂一次的应用程序中。提前致谢。
在我的应用程序中在哪里打开和在哪里关闭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; }
并且必须为每种方法关闭会话。这样就不会为每个类都创建会话工厂。