2

我正在尝试使用 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(),但仍然无法理解为什么会这样?

4

2 回答 2

0

结果currentSession在许多情况下非常脆弱。

错误后您可能有未定义的状态,因此请确保您的“当前会话”和事务没有被先前的错误破坏。为了实现这一点,在使用DAO 内部isActive调用之前打印出事务状态 ( )。getCurrentSession

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

assert getCurrentSession()==getCurrentSession()

我从惨痛的教训中吸取了教训,对 Hibernate 非常保守。因此,花一些时间在基础知识上确实有回报。

于 2013-05-22T17:57:21.150 回答
0

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

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

于 2013-05-30T13:50:27.580 回答