标签:style blog http color 使用 strong 文件 数据
使用 Hibernate 的大多数应用程序需要某种形式的“上下文相关的”会话,特定的会话在整个特
定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常是困难的;不同的上下文对“当前”这个概念定义了不同的范围。在 3.0 版本之前,使用 Hibernate 的程序要么采用自行编写的基于 ThreadLocal 的上下文会话,要么采用HibernateUtil 这样的辅助类,要么采用第三方框架(比如 Spring 或 Pico),它们提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关的会话。从
3.0.1 版本开始,Hibernate 增加了SessionFactory.getCurrentSession() 方法。一开始,它假定了采用 JTA 事务,JTA 事务定义了当前 session 的范围和上下文(scope 和 context)。因为有好几个独立的 JTA TransactionManager 实现稳定可用,不论是否被部署到一个 J2EE 容器中,
大多数(假若不是所有的)应用程序都应该采用 JTA 事务管理。基于这一点,采用 JTA 的上下文相关的会话可以满足你一切需要。
再来看我的配置,讲
hibernate.current_session_context_class的值设成thread。按我简单的理解就是将
getCurrentSession()返回的session绑定到当前运行线程中。比较专业的说法是此session的上下文是thread,但不是
spring已经托管的那个Session对象。再用哥那大腿想了几下,瞬间了解了一些。所以获取的session是在spring代理的上下文之外的的
当前线程之中,所以此session并非事务管理器代理的那个session,不会自动开启事务。根据官方提示:第三方框架提供了基于代理(proxy)
或者基于拦截器(interception)的上下文相关的会话的管理,所以把hibernate.current_session_context_class设置删除了,一切又回到当初风平浪静的日子了。
参考http://justsee.iteye.com/blog/1061576,终于了解这个问题的前因后果。摘录如下:
在ssh2中的sessionFactory配置文件中应将 hibernate.current_session_context_class设为 org.springframework.orm.hibernate3.SpringSessionContext(默认为此值),并应用spring 管理事务。
如果为<prop key="hibernate.current_session_context_class">thread</prop> 则会报异常,
原因还是spring中hibernate.current_session_context_class的问题
在spring的类LocalSessionFactoryBean源码,方法buildSessionFactory中将 hibernate.current_session_context_class设为 org.springframework.orm.hibernate3.SpringSessionContext
碰到这个错误弄了好久
<转>如果你报createSQLQuery is not valid without active transaction,请看这里,布布扣,bubuko.com
<转>如果你报createSQLQuery is not valid without active transaction,请看这里
标签:style blog http color 使用 strong 文件 数据
原文地址:http://www.cnblogs.com/kite/p/3867810.html