getCurrentSession() 与 openSession()

Posted

技术标签:

【中文标题】getCurrentSession() 与 openSession()【英文标题】:getCurrentSession() vs openSession() 【发布时间】:2013-05-17 12:22:33 【问题描述】:

我正在尝试使用 generic-dao (http://code.google.com/p/hibernate-generic-dao/)。然而,在我的 HibernateBaseDAO 中,getSession() 方法被实现为 sessionFactory.getCurrentSession()。这会导致任何实体更新出错

org.hibernate.HibernateException: createCriteria is not valid without active transaction

但是,当我使用 openSession() 代替 getCurrentSession() 时,它可以工作。我没有在 pom.xml 中使用 spring 作为依赖项。我一直在阅读 openSession() 和 getCurrentSession(),但仍然无法理解为什么会这样?

【问题讨论】:

你指定hibernate使用ThreadLocalSessionContext了吗? 是的,我已经指定了 ThreadLocalSessionContext 【参考方案1】:

currentSession 在很多情况下都非常脆弱。

您可能在发生错误后处于未定义状态,因此请确保您的“当前会话”和事务未被先前的错误破坏。为此,请在 DAO 中调用 getCurrentSession 之前打印出事务状态 (isActive)。

仔细检查SessionContext 是否已配置并正常工作;调用getCurrentSession 两次并检查返回的实例是否相同,如果不是,您可能正在查看不同的会话:

assert getCurrentSession()==getCurrentSession()

我从惨痛的教训中吸取了教训,对 Hibernate 非常保守。所以花一些时间在基础知识上真的很值得。

【讨论】:

【参考方案2】:

找到了解决方案,使用 genericDAO 它获取需要使用 openSession() 显式打开的当前会话,而 getCurrentSession() 只是将其附加到 current session。据作者介绍

GenericDAO 假设您将处理事务 DAO 外部

【讨论】:

以上是关于getCurrentSession() 与 openSession()的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate中getCurrentSession()与openSession()的区别及应用

休眠 openSession() 与 getCurrentSession()

hibernate 的SessionFactory的getCurrentSession 与 openSession() 的区别

hibernate 的SessionFactory的getCurrentSession 与 openSession() 的区别

JTASessionContext 与 JDBCTransactionFactory 一起使用;使用 getCurrentSession() 无法正确操作自动刷新

Hibernate框架使用 getCurrentSession()获取Session对象相关问题