非常多时候我们使用hibernate的session时,都是让session在某一执行环境中保持其唯一。

比如在同一线程内用同一个session。在同一方法内用同一session,这样我们就能够用session里面缓存好的数据。但。我想说的不是缓存,且听我一一道来。

近期试用spring3.0.2+struts2.18+hibernate3.3.2学习搭建一个web项目,出现了一个相当郁闷的问题。

就是我明明配置好了spring管理hibernate事务了,当我在dao中运行hibernate的方法时。如save。delete,update,createQuery,总是说不能在没有活动的事务中运行(org.hibernate.HibernateException: createSQLQuery is not valid without active transaction)。立刻上google查。一无所获。曾几度怀疑是否配置写出了。dao或service写错了,改来改去的依然存在问题。当时相当郁闷啊,想啊,你spring不是帮我管理事务么?你不自己主动开启事务啊,还要我手动开启啊。立刻查spring文档。从中文到英文。没发现什么有參考价值的线索,真是相当的打击。代码乱改一通。发现用spring的hibernatetemplate来进行数据操作又正常无比。不死心的去查了hibernate的doc,一个不留神给哥发现了一个冗长的配置属性:hibernate.current_session_context_class。心里巨爽无比,就是你丫啦。小样的。哥把你灭了。

hibernate.current_session_context_class是做什么用的呢?通俗点来讲。就是配置session绑定到某一执行环境,比如从同一个线程中用getCurrentSession()取得的session都是同一个。当前没有session就自己主动创建一个返回给你丫用。问题就出在这里了。官方文档例如以下说: 使用 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

传智播客成都java培训中心:http://cd.itcast.cn?140831ls

编程异常——假设你报createSQLQuery is not valid without active transaction,...相关推荐

  1. 解决load,get,save 等is not valid without active transaction异常的原因。

    org.hibernate.HibernateException:*** is not valid without active transaction 2010-12-09 15:36:07 标签: ...

  2. [C++]Linux之C编程异常[true未定义解决方案]

    [C++]Linux之C编程异常[true未定义解决方案] 参考文章: (1)[C++]Linux之C编程异常[true未定义解决方案] (2)https://www.cnblogs.com/john ...

  3. 用python编程、假设一年期定期利率_Python习题选编 -

    Python习题选编 华东师大信息学院计算中心 一.程序结构与算法部分: 1. 编写一个python程序,输入两个数,比较它们的大小并输出其中较大者. 参考代码: x = int(input(\y = ...

  4. 用 Python 编程,假设一年期定期利率为 3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?

    用 Python 编程,假设一年期定期利率为 3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?  # -*- coding:utf-8 -*- save = 10000 year ...

  5. SpringBoot文件上传异常之temporary upload location not valid

    原文: 一灰灰Blog之Spring系列教程文件上传异常原理分析 SpringBoot搭建的应用,一直工作得好好的,突然发现上传文件失败,提示org.springframework.web.multi ...

  6. 异步编程异常和死锁处理

    在.NET异步编程中,通常使用async和await这对黄金搭档,返回类型使用Task或Task<T>.在方法前面加async表示这个方法运行异步,在方法内使用await表示执行一个异步等 ...

  7. C 编程异常 — /usr/bin/ld: 找不到 -lm

    问题:在编程程序的时候报错. /usr/bin/ld: 找不到 -lm /usr/bin/ld: 找不到 -lc 原因:缺少库文件. 解决: yum install -y libstdc++-stat ...

  8. java 运行异常处理_Java编程异常处理和I/O流

    重点: 1.在编写程序时,要正确地使用捕获例外和声明抛出异常的两种例外处理的方法. 2.遇到实际问题时,要根据需要正确使用各种输入/输出流,特别是对中文使用适当的字符输入流. 3.正确使用对象串行化的 ...

  9. 用python编程、假设一年期定期利率_第二章-习题答案

    第二章习题 1 . 写一个算法(流程图和 python 程序) :输入三个数,输出其最 大者. numA=3 numB=4 numC=5 if numA <= numB: if numC pri ...

最新文章

  1. PHP做好友关系系统,php社交好友网站
  2. android gridview显示本地图片大小,在Android上的GridView中调整图像大小
  3. J2EE下的常用设计模式
  4. windows10会中php病毒吗,win10发现病毒自动删除怎么办
  5. 算法与数据结构_数据结构与算法专题--算法基本概念
  6. 预告:大牛现身说法 TensorFlow在工程项目中的应用 | AI 研习社
  7. 安卓学习 之 碎片(四)
  8. RTT实时操作系统概念
  9. java中访问控制修饰符什么含义_关于Java中访问控制修饰符的来由及浅解
  10. 软件工程导论团队介绍——信科吴彦组
  11. 游戏玩家的留存率统计实现
  12. 批量下载wsdl文件
  13. java环境配置(jdk、jre安装和环境配置)
  14. matlab绘制彩色图像直方图
  15. 当C++遇上AUTOSAR编码规范,你的安全我来护航
  16. 剑客之剑——倚天剑(Vim)
  17. html悬挂缩进2字符,文章中如何设置悬挂缩进2字符
  18. three.js 构建简单的房间
  19. 总结iPhone、iPad各机型对应的iOS 系统版本(最全)
  20. hdiraw多点分析,使用getevnt进行上报

热门文章

  1. 从零开始学习jQuery (六) AJAX快餐【转】
  2. 20165313-张晨晖课设个人报告
  3. jmeter对需要登录的接口进行性能测测试
  4. 诺康得NKD完成500万天使轮融资,专注于糖化学细胞治疗...
  5. 英文谚语:Take that with a grain of salt
  6. Linux系统备份还原工具3(使用Clonezilla/再生龙对硬盘进行镜像和克隆,类似于Ghost)...
  7. 黑客组织称7月将售新入侵工具 价格超2.2万美元
  8. 编程之美初赛第一场--焦距
  9. ThinkPHP 3.2 Token表单令牌
  10. 关于cookie的文章(cookie与session机制)