LazyInitializationException分析_weixin_46279293的博客-程序员秘密

技术标签: hibernate  

LazyInitializationException分析

我们在使用Hibernate时,最终都会通过HibernateTemplate的doExecute来执行我们的方法,执行前会获取一个session,执行后会关闭session,当session关闭后,还用该session去操作数据库,就会这样的问题。

如下图所示:

(img-JchchZrM-1587019521473)(LazyInitializationException%E5%88%86%E6%9E%90.assets/image-20200416141258965.png)]

可以在 HibernateTemplate 中的 doExecute 读到相关代码。

为了保证在同一个线程中,session使用同一个,保证 懒加载等后续操作不至于出现 no session ,我们可以通过如下方案解决:

一、开启OpenSessionInViewFilter

<filter>
   <filter-name>hibernateFilter</filter-name>
   <filter-class>
     org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
   </filter-class>
 </filter>

该Filter 在http 到达前会有个拦截,拦截请求后会创建一个session,和 sessionFactory 一同绑定到当前线程中。只要http不端口,在这个http事务之类的数据库操作多会用同一个session。

可以看下OpenSessionInViewFilter的继承关系
在这里插入图片描述

OpenSessionInViewFilter 继承至OncePerRequestFilter,保证了同一个线程中,调用doFilterInternal 只会调用一次,如果内部forward也不会多执行一次,保证了使用同一个session。

通过OpenSessionInViewFilter 的调用关系:

http开始前绑定session到当前线程,doExecute 获取session拿取当前线程的session,http结束后关闭session,保证过程中session是同一个,并且是开启的。

在这里插入图片描述

二、保证执行的方法有事务

spring托管的事务一般切到service层,事务开始时会获取一个session。和 sessionFactory 一同绑定到当前线程中。只要最外层事务不结束,session 不会断开,在这个事务之内的数据库操作都会用同一个session。

调用关系1:service中方法

update(){
    
//同一个session
aDao.query();
//同一个session
bDao.query();
}

调用关系2:service中方法

update(){
    
//同一个session,掉用另外一个有事务的方法,提供事务,这个时候也不会关闭session,直到出最外层方法体,session才会关闭
bService.update();
//同一个session
bDao.query();
}

注意:session 好比是道路,事务好比是运行一趟货物,你可以在道路上来回运输多次货物,道路通就好。

有事务的调用关系如下:

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46279293/article/details/105557930

智能推荐

Lotus Domino/Notes development 学习笔记(1)_《中文lotus domino / notes r7 应用开发指南》_monkeyxxxx的博客-程序员秘密

最近打算用Lotus做个项目,第一次接触感觉不太容易上手,网上的资料少的可怜,只有凑合了。项目时间很紧,不知道能不能搞定。 Lotus Notes/Domino 是业界公认的群件“鼻祖”和事实标准。它有机集成了电子邮件系统,文档数据库和 Web 服务器。在 Domino 中,以邮件系统为通讯基础,以文档数据库存放信息进行数据的分析处理和管理,以 Web 服务器提供用户更灵活的访问服务器的方

IntelliJ Idea 的markdown 无法预览,插件提示 There are no available preview providers_idea md预览_流萤灯的博客-程序员秘密

问题如题markdown文件右上角没有预览的按钮,在Language中markdown显示There are no available preview providers原因可能是你使用了版本比较新的idea,并且idea的运行时jdk是1.8以上的版本(idea的jdk而不是你项目的jdk,可以使用choose Runtime插件查看和更换),markdown插件需要javaFX支持,但是java8以后的jdk没有自带javaFX,所以无法预览。解决方法更换捆绑了javaFX的jdk更

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated.._zq33312757的博客-程序员秘密

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY

vim实用技巧_vim使用技巧_Chrisn gs的博客-程序员秘密

vim基本功能介绍和通过vim提供的功能来实现快意编程的目的

电路基础-二阶(second -order) 电路_二阶电路_Shanner的博客-程序员秘密

电路基础-二阶second -order 电路二阶微分方程计算初值和终值无源串联RLC 电路无源并联RLC 电路串联RLC 电路的阶跃响应并联RLC 电路的阶跃响应前一章中,我们讨论了带有单个储能元件( 一个电容器或一个电感器)的电路,因为它们是用一阶微分方程描述的,所以称为一阶电路。在这一章中,我们将考虑包含两个储能元件的电路,称为二阶(second -order) 电路,因为它们的响应是...

TypeError: Invalid attempt to spread non-iterable instance. In order to be iterable, non-array objec_浅端的博客-程序员秘密

看一下百度翻译:类型错误:传播不可提交实例的尝试无效。 为了可iterable,非数组对象必须有一个[Symbol.iterator]()方法。网上查询到的说法是:此类错误多为不可遍历导致的。来看一下我的代码: &lt;List dataSource={{}} //就是这一行出了问题 ...

随便推点

过程与函数_weixin_33797791的博客-程序员秘密

例程(routine)是Pascal 的一个重要概念,例程由一系列语句组成,例程名是唯一的,通过例程名你可以多次调用它,这样程序中只需要一个例程就够了,由此避免了代码多次重复,而且代码也容易修改维护。从这个角度看,你可以认为例程是一种基本的代码封装机制。介绍完Pascal 例程的语法后,我会回过头来举例说明这个问题。Pascal 过程与函数 Pascal中的例程有两种形式:过程和函数。理论上说...

android framework 系统native c/c++源码查看跳转工具-Ubuntu+VScode搭建_android framework native_Android高级知识分享官的博客-程序员秘密

hi,粉丝朋友们大家好!~~ps需要学习深入framework(可以加我qq:2102309716 优惠购买)因为之前我的入门课程中已经对android系统源码环境进行了讲解!当时我们用的是as进行的,但是as对于我们java文件确实是比较友好的,跳转和修改代码提示等也非常方便。但是对于我们如果是修改native如c/c++相关代码时候,就显得非常不友好了,连基本的样式颜色变化都没有,所以这里我们如果开发native程序比较多,或分析相关代码比较多的话就还是需要找一个比较好的工具进行,其实普遍比较主流

0基础学华为认证HCIA该怎么学?_hcia学习_落叶归归归的博客-程序员秘密

1.华为认证分为工程师HCIA,高级工程师HCIP,专家HCIE这三个认证等级。HCIA:华为认证ICT工程师是华为职业认证中用于标识个人能力在某一技术领域达到工程师级别的证明,表示通过认证的人员具备安装、配置、运行 ICT 设备,并进行故障排除的能力。HCIP:华为认证ICT高级工程师是华为职业认证中用于标识个人能力在某一技术领域达到高级工程师级别的证明,表示通过认证的人员具有丰富的 ICT 知识和实践能力。HCIE:华为认证ICT专家是华为认证体系中最高级别的 ICT 技术认证,

OV7670摄像头模块资料_-liming-的博客-程序员秘密

OV7670摄像头模块资料一、实物图和原理图二、模块简介OV7670 是 OV( OmniVision)公司生产的 CMOS VGA 图像传感器。该传感器体积小、工作电压低,提供单片 VGA 摄像头和影像处理器的所有功能。通过 SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率 8 位影像数据。该产品 VGA 图像最高达到 30 帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、度、色度等都可以通过 SCCB 接口编程。OV图像传感

html自动计算浏览器宽高,html div宽高自适应问题(保证展示最佳效果的宽高、div高度占满浏览器)..._书童小二的博客-程序员秘密

一、布局如下: 二、设计目标:1、高度要占满整个浏览器的可视高度。2、div高度可变化,但内容不能溢出。3、缩放浏览器、或更改分辨率,都可完美的自适应。三、设计思路:1、宽度自适应,网上有很多关于“负边距”的技术。2、高度自适应?没有负边距技术中用到的float,不能使用负边距实现。3、div中使用min-height,保证最小的压缩高度,浏览器再小,就会出现滚动条。四、设计代码 top 需要自适...

资源向导之 "Data structure and Algorithm"_JasonLeaster的博客-程序员秘密

几本神书:MIT Introduction to algorithmhttp://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/index.htmMIT Design and Anal

推荐文章

热门文章

相关标签