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() 无法正确操作自动刷新