getCurrentSession()vs openSession()

时间:2013-05-22 12:35:16

标签: java hibernate genericdao hibernate-generic-dao

我正在尝试使用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()时,它可以工作。我没有使用spring作为pom.xml中的依赖项。我一直在阅读openSession()和getCurrentSession(),但仍然无法理解为什么会这样?

2 个答案:

答案 0 :(得分:0)

currentSession在可能的情况下变得非常脆弱。

错误后您可能处于未定义状态,因此请确保您的“当前会话”和事务未被先前错误销毁。要实现这一点,在DAO中调用getCurrentSession之前打印出事务状态(isActive)

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

assert getCurrentSession()==getCurrentSession()

我从hibernate学到了非常保守的经验教训。因此,花一些时间在基础知识上确实是值得的。

HTH 史蒂夫

答案 1 :(得分:0)

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

  

GenericDAO假设您将处理交易   在DAO外部