【问题标题】:Understanding SessionFactory and Hibernate Sessions了解 SessionFactory 和 Hibernate 会话
【发布时间】:2014-06-14 14:08:51
【问题描述】:

我现在正在学习 Hibernate,我需要帮助来了解 Sessions 的工作原理。我在下面给出的类中有一些方法。

我看到SessionFactory 类中有一个getCurrentSession()。因此,似乎只有一个Session 可以在SessionFactory 中“活动”。这是SessionFactory 喜欢吗 事务按顺序完成的事务队列?如果是,那么 是否可以将事务提升到更高或更低的优先级?

private static SessionFactory factory;  

//Get a hibernate session.
public static Session getSession(){
    if(factory == null){

        Configuration config = HibernateUtil.getConfiguration();
        factory = config.buildSessionFactory();

    }   
    Session hibernateSession = factory.getCurrentSession();
    return hibernateSession;
}

public static void commitTransaction(){
    HibernateUtil.getSession().getTransaction().commit();
}

public static void rollbackTransaction(){       
    HibernateUtil.getSession().getTransaction().rollback();
}

还有一些使用getTransaction()的方法。

【问题讨论】:

    标签: java hibernate session


    【解决方案1】:

    SessionFactory 的工作是隐藏会话创建策略。例如,在 Web 应用程序中,您可能希望 SessionFactory 在第一次在线程上调用 getCurrentSession() 时返回创建 Session,然后从该点向前返回相同的 Session,持续时间为请求。 (因为您可能想从该会话加载客户数据,然后可能在同一会话中修改他们的帐户。)其他时候,您可能希望 SessionFactory 在每次调用 getCurrentSession() 时创建一个全新的会话。因此,通过将此决定隐藏在 SessionFactory API 后面,您只需编写从工厂获取 Session 并对其进行操作的代码。

    Session 用于处理事务。正如您可能期望的那样,事务在Session 中启动,然后完成或回滚。确实没有办法确定它们的优先级,因为一旦它们启动,您就承诺要么回滚它,要么提交它。

    【讨论】:

    • 是的,所有调用 factory.getCurrentSession() 的方法如何知道它们正在访问相同的 Session ?有人可能想知道beginTransaction() 是否会获得一个会话,而commitTransaction() 是否会获得另一个会话,从而使交易变得无用。我怎么知道我正在处理正确的交易?
    • 这取决于SessionFactory 的配置方式。 SessionFactory 会给你“正确的”Session。 “正确”的含义取决于您的应用程序。正如 SessionFactory 的 javadoc 中所述:“获取当前会话。‘当前’的确切含义由配置为使用的 CurrentSessionContext impl 控制。”如果你想验证它是否按照你的想法做,那么检查返回会话的哈希码以确保它是同一个会话。
    • SessionFactory 可以在 spring XML config 中配置。在定义事务管理器时定义会话工厂,您可以确保所有事务都将使用您配置的会话工厂。
    • James 是对的——它要么在你的 Spring XML 配置中(如果你使用 Spring),要么在你的 Hibernate XML 配置中(如果你不是的话)(这似乎是你的情况)。此配置实际驻留的位置取决于 HibernateUtil.getConfiguration() 的实现(HibernateUtil 不是官方的 Hibernate 类,因此它仅取决于它的实现方式 - 通常,它会加载一些 XML 文件。)请参阅 docs.jboss.org/hibernate/core/3.3/reference/en-US/html/…
    • 查看我在之前评论中发布的文档链接中的 current_session_context_class 属性。希望对您有所帮助。
    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2015-12-02
    • 2017-12-22
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多