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)
任何提示?
答案 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文档以获取更多详细信息)