您好,欢迎访问一九零五行业门户网

atitit.springhibernate的事务机制spring不能保存对象的解决

在spring中使用hibernate,如果我们配置了transactionmanager,那么我们就不应该调用sessionfactory的opensession()来获得sessioin,因为这样获得的session并没有被事务管理。 采用getcurrentsession()创建的session会绑定到当前线程中,而采用opensession()
在spring中使用hibernate,如果我们配置了transactionmanager,那么我们就不应该调用sessionfactory的opensession()来获得sessioin,因为这样获得的session并没有被事务管理。
采用getcurrentsession()创建的session会绑定到当前线程中,而采用opensession()创建的session则不会。
采用getcurrentsession()创建的session在commit或rollback时会自动关闭,而采用opensession()创建的session必须手动关闭。
使用getcurrentsession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事务(jdbc事务)
thread
* 如果使用的是全局事务(jta事务)
jta
如果采用的时hibernate4,使用getcurrentsession()必须配置事务,否则无法取到session
3 hibernatetemplate.getsessionfactory().getcurrentsession()
我们使用spring和hibernate结合,操作数据库最常用可能是hibernatetemplate,hibernatetemplate中集成了很多使用的方法,可惜的是没的createquery方法,也许我们使用hibernate的时候喜欢使用query,我们可能会封装hibernatetemplate.getsessionfactory().getcurrentsession()方法得到session,session创建query,这是一个方法,但你应该会得到异常 “createquery without an active transaction”,因为使用hibernatete【本文来自鸿网互联 (http://www.68idc.cn)】mplate.getsessionfactory().getcurrentsession(),你是使用的hibernate的事务管理,而你指望spring管理的事务是hibernatetemplate,所以你会提示没有打开事务的异常,解决方法:1)使用hibernate事务处理,就像上面单独使用hibernate一样,但这也许不是你想要的。2)使用hibernatetemplate的hibernatecallback回调:
使用hibernate的大多数应用程序需要某种形式的“上下文相关的” session,特定的session在整个特定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常 是困难的;不同的上下文对“当前”这个概念定义了不同的范围。在3.0版本之前,使用hibernate的程序要么采用自行编写的基于 threadlocal的上下文session,要么采用hibernateutil这样的辅助类,要么采用第三方框架(比如spring或pico), 它们提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关session。
从3.0.1版本开 始,hibernate增加了sessionfactory.getcurrentsession()方法。一开始,它假定了采用jta事务,jta事务 定义了当前session的范围和上下文(scope and context)。hibernate开发团队坚信,因为有好几个独立的jta transactionmanager实现稳定可用,不论是否被部署到一个j2ee容器中,大多数(假若不是所有的)应用程序都应该采用jta事务管理。 基于这一点,采用jta的上下文相关session可以满足你一切需要。
更好的是,从3.1开 始,sessionfactory.getcurrentsession()的后台实现是可拔插的。因此,我们引入了新的扩展接口 (org.hibernate.context.currentsessioncontext)和新的配置参数 (hibernate.current_session_context_class),以便对什么是“当前session”的范围和上下文(scope and context)的定义进行拔插。
其它类似信息

推荐信息