我正在尝试使用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(),但仍然无法理解为什么会这样?
答案 0 :(得分:0)
currentSession在可能的情况下变得非常脆弱。
错误后您可能处于未定义状态,因此请确保您的“当前会话”和事务未被先前错误销毁。要实现这一点,在DAO中调用getCurrentSession之前打印出事务状态(isActive)
仔细检查SessionContext是否已配置并正常工作;调用getCurrentSession两次并检查返回的实例是否相同,如果没有,您可能正在查看不同的会话:
assert getCurrentSession()==getCurrentSession()
我从hibernate学到了非常保守的经验教训。因此,花一些时间在基础知识上确实是值得的。
HTH 史蒂夫
答案 1 :(得分:0)
找到解决方案,使用genericDAO,它获取当前会话,需要使用openSession()显式打开,而getCurrentSession()只是将它附加到current session。根据作者的说法
GenericDAO假设您将处理交易 在DAO外部