Spring:为什么Hibernate 4中的SessionFactoryUtils类不提供getSession方法?

时间:2012-02-08 12:21:01

标签: spring hibernate-4.x

Spring 3.1.0中Hibernate 4的SessionFactoryUtils.getSession方法发生了什么变化?应该用什么呢? sessionFactory.getCurrentSession()不断给我这个例外:

org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:883)

任何提示?

4 个答案:

答案 0 :(得分:3)

使用sessionFactory.getCurrentSession()

我相信“当前会话”的概念来自Hibernate 3,SessionFactoryUtil是在此之前编写的。

答案 1 :(得分:1)

不确定他们为什么删除它,可能是他们使用org.hibernate.context.CurrentSessionContext实现了更好的设计。从this post开始:

  

...只需使用简单的SessionFactory并使用getCurrentSession   获取当前事务会话的方法(不要使用   openSession !!!!)你很高兴...

documentation of SessionFactory.getCurrentSession()开始:

The definition of what exactly "current" means controlled by the CurrentSessionContext impl configured for use.

答案 2 :(得分:0)

如果您没有使用Spring正确配置事务划分,则会发生“org.hibernate.HibernateException: No Session found for current thread”异常。

通常,Spring会在您的事务开始时为您打开一个会话,将其绑定到ThreadLocal并在您的事务持续期间重新使用它。当您的事务提交时,会话将被关闭(刷新后)。因此,您无需亲自拨打SessionFactory课程。

通常,人们会将@Transactional放在某个类(通常是服务)上,并将configure Spring to start and end transactions on method invocations放在该类上。

答案 3 :(得分:0)

您必须添加一个属性示例:

<prop key="hibernate.current_session_context_class">thread</prop>

到会话工厂bean映射。 (查看hibernate文档以获取更多详细信息)