当前位置: 首页 > 面试题库 >

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

梁丘波
2023-03-14
问题内容

我正在开发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;
}

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



 类似资料:
  • 问题内容: 我需要在android中使用mapview控件,但似乎无法理解如何运行。是否安装了eclipse?我似乎找不到下载链接。 谢谢 问题答案: 是标准Java发行版的一部分。 在Windows 64位计算机上,通常会在以下位置找到jdk 它用于管理您可以使用jar文件签名的密钥和证书。 如果您提供所需做的更多详细信息,我们可能会给您更具体的答案。

  • 问题内容: 考虑以下代码: 上面没有编译,因为都和抛出。那么,我是否要在finally子句中添加try / catch块?还是将close语句移到try子句中?还是只是不打扰靠近? 问题答案: 对于文件I / O,通常将try / catch添加到finally块。但是,您必须注意不要从finally块中抛出任何异常,因为它们会导致原始异常(如果有)丢失。 有关关闭数据库连接的更具体的示例,请参见

  • 问题内容: Swing应用程序现在真的被使用吗?我找不到使用它们的地方。可以跳过AWT和Swing包吗(尽管我学到了一些基础知识)? 问题答案: 如果您是专门为Web编写的,则可以跳过Swing,否则,您肯定会碰上它。如果没有Swing GUI,我从来没有在非平凡的Java应用程序上工作过。 另外,Swing是更好使用的API之一。如果您使用大多数其他工具,则会发现它们更加难以使用和/或与平台不兼

  • 问题内容: 我在某处读到该函数将空字符串视为,因此这不是从HTML表单验证文本输入和文本框的有效方法。 因此,您可以用来检查用户是否键入了某些内容。 函数将空字符串视为是真的吗? 那我应该在什么情况下使用呢?我应该经常检查是否有东西吗? 例如代替 使用这个 问题答案: isset vs.!empty 自由贸易协定: “ isset()检查变量的值是否包含(False,0或空字符串),但不包含NUL

  • 问题内容: 所以最近我一直在研究Clojure,我喜欢这种语言。我想看看是否可以在其中制作一个小型Web应用程序,以挑战自己。但是,我绝对没有建立任何与Java相关的Web应用程序的经验。实际上,我实际上对Java没有太多的经验。我从哪说起呢?我在Apache和LAMP堆栈方面拥有丰富的经验,并且我知道在Apache上大多数情况下我只会使用Fast- CGI,但我不知道Java世界中的等效功能(如

  • 问题内容: 我正在使用SphinxSearch查询某些内容,并具有要使用MySQL查询的对象的ID。我的ID数组根据Sphinx给出的排名进行排序。因此,我想制作一个像这样的MySQL: 我知道我可以做: 但是我无法获得订单。 我如何与Laravel以适当的方式做到这一点? 问题答案: 使用http://laravelsnippets.com/snippets/get-all-items-at-o