gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:07:36 27 4
gpt4 key购买 nike

我正在开发 jsf 应用程序并使用 hibernate 作为后端。我想创建 session 工厂并在整个应用程序中关闭它一次。我正在使用 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 类的每个方法中,我都会打开 session 工厂并关闭它。因此,我只能在应用程序中打开/关闭 session 工厂一次。提前致谢。

最佳答案

规则是您的应用程序中应该有且仅有一个 SessionFactory。

在哪里打开和关闭它取决于应用程序是什么:

  • 对于经典应用程序,它将在 main 中打开和关闭。
  • 对于 Web 应用程序,它将在 ServletContextListener 中打开和关闭(分别在 contextInitialized 和 contextDestroyed 事件中)

您还可以使用单例并像上面一样在静态方法中创建它并在最后关闭它。

但是请不要在 DAO 方法结束时关闭 session 工厂

对于 session ,您在工作单元开始时通过openSession获得一个 session ,并在提交或回滚后关闭它(如果出现异常,您必须回滚并立即关闭 session )。但 Hibernate 手册指出:Hibernate org.hibernate.Session 的范围是灵活的,但您永远不应该将应用程序设计为对每个数据库操作使用新的 Hibernate org.hibernate.Session。尽管在以下示例中使用了它,但仍将每次操作 session 视为反模式。

通常,您将针对每个需要事务的事务使用一个 session 。例如,在 Web 应用程序中,每个请求一个 session 是一种常见的设计。

但是您也可以使用 Spring 等更高级别的框架,它将为您完成所有 SessionFactory 和 Session 管理。

关于java - 在我的应用程序中在哪里打开和关闭 SessionFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30096416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com