hibbernate懒加载与opensessioninview

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1 执行命令: make -j 4 && make install 这里要等待一段时间,等待编译完成。执行命令: ./configure --prefix=/usr/local/src/zlilb。执行命令: ./config --prefix=/usr/local/src/openssl。执行命令: make -j 4 && make test && make install。执行命令: make -j 4 && make install。执行命令: /etc/init.d/sshd restart。 阅读详情

 事务的特点(ACID)
1)原子性(Atomic)
事务由一个或多个行为绑在一起组成的,好像一个单独的工作单元。事务中的操作要么都发生,要么都不发生。
2)一致性(Consistent)一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的。
3)隔离性(Isolated)事务应该允许多个用户操作同一个数据,一个用户的操作不会和其他用户的操作相混浊。
4)持久性(Durable)一旦事务完成,事务的结果应该持久化。

 这个问题在面试中也经常被问到,下面我就来系统的和大家分享一下,面试也就OK了。

下面来看一下懒加载的介绍,如下所示

     延迟加载就是懒加载,使用懒加载是解决了负载问题,也就是说懒加载后不会立即去访问数据库,而是尽量延迟,延迟到用户执行数据库查询命令的时候或者使用initialize方法的时候去和数据库交互,这样就减轻了与数据库交互的压力,如果缓存中有数据的话会优先考虑缓存数据,总之是尽量避免和数据库的直接交互,但有些时候也会出现数据没有得到及时更新的错误数据,所以,在金融等方面的项目开发的时候尽量避免懒加载。比如在统计论坛数据访问量等要求不是很严格的情况并且数据量比较大的情况下可以使用懒加载。 
【load】load方法会导致懒加载出现,如果要数据及时送入数据库的话,使用save方法时,load会延迟至强制访问数据库执行,比如get方法调用的时候。
【one to one映射】对于懒加载,一对一映射中的constrained属性设置为true的时候实现懒加载,lazy决定了什么时候进行懒加载,而fetch决定了抓取的方式。
【mang to one映射】对于多对一映射中,默认情况下是懒加载的,这样有利于减轻系统负载,如果要取消懒加载进行查询的话,在集合端中把lazy属性设置为false就可以。
【总结】懒加载是通过代理方式实现的,代理的对象在访问的时候才会去和数据库进行交互,前提是session没有被关掉的情况下。

在web开发中,我们也可以使用opensessioninview来解决这样的问题,这就要使用到一个类ThreadLocal,事物都有两面性,使用这种机制也有一些缺点

(1)并发性减弱 
(2)内存消耗加大

使用这种模式可以解决以下问题:

  (1)hibernate事物边界问题 
  (2) 因session关闭导致hibernate延迟加载例外的问题

OpenSessionInView模式:
  * 需要构建一个过滤器,把事物的创建及提交放在过滤器里进行。
  * 加大session的有效范围,把session放在当前线程里(ThreadLocal),使session在当前线程内有效,并且在当前线程内访问的是同一个session。

 

这个过滤器在spring的开发包里有,也可以自己写

import java.io.IOException;  
  
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
  
import org.hibernate.Session;  
import org.hibernate.Transaction;  
  
import com.yx.zzg.util.HibernateUtil;  
  
public class OpenSessionInView implements Filter {  
  
    public void destroy() {  
  
    }  
  
    public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain filter) throws IOException, ServletException {  
        Transaction tx = null;  
        Session session = null;  
        try {  
            session = HibernateUtil.getThreadLocalSession();  
            tx = session.beginTransaction();  
            filter.doFilter(request, response);  
            tx.commit();  
        } catch (Exception e) {  
            if (tx != null) {  
                tx.rollback();  
                throw new RuntimeException(e.getMessage(),e);  
            }  
        } finally {  
            HibernateUtil.colseSession();  
        }  
    }  
  
    public void init(FilterConfig arg0) throws ServletException {  
  
    }  
  
}  


下面来写个工具类,来获取session,代码如下所示

import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.cfg.Configuration;  
  
public class HibernateUtil {  
      
    private static SessionFactory sessionFactory;  
  
    //创建一个ThreadLocal对象  
    private static ThreadLocal threadSession = new ThreadLocal();  
  
    private HibernateUtil() {  
  
    }  
  
    static {  
        Configuration cfg = new Configuration().configure();  
        sessionFactory = cfg.buildSessionFactory();  
    }  
  
    /** 
     * 从当前线程中获取session,如果没有,则得到session,并将此session放入当前线程中 
     * @return 
     */  
    public static Session getThreadLocalSession() {  
        Session session = (Session) threadSession.get();  
        if (session == null) {  
            session = getSession();  
            threadSession.set(session);  
        }  
        return session;  
    }  
  
    /** 
     * 关闭session,并将当前线程中的session设置为null 
     */  
    public static void colseSession() {  
        Session session = (Session) threadSession.get();  
        if (session != null) {  
            session.close();  
            threadSession.set(null);  
        }  
    }  
  
    public static Session getSession() {  
        return sessionFactory.openSession();  
    }  
  
}  



这样做就不会有懒加载异常出现了。

使用Matlab与V-REP联合仿真 在Matlab中,我们可以使用V-REP提供的远程API(Application Programming Interface)来连接到V-REP仿真环境。为了连接Matlab与V-REP,我们需要在Matlab中添加V-REP的远程API函数库。你可以根据具体的需求编写Matlab脚本来控制V-REP场景中的机器人,并进行系统建模和仿真。一旦成功连接到V-REP,我们可以使用Matlab来控制V-REP场景中的机器人。在本文中,我们将介绍如何使用Matlab与V-REP进行联合仿真,并提供相应的源代码。 阅读详情

相关推荐

Windows平台MuJoCo仿真环境配置与Qt集成实战

本文详细介绍了在Windows平台上配置MuJoCo物理仿真环境并与Qt框架集成的完整实战流程。内容涵盖从环境准备、库文件配置、项目创建到核心代码编写的每一步,重点解决了Windows下常见的编译链接错误和路径问题,帮助开发者在Windows系统中高效搭建机器人仿真与可视化控制开发环境。

weixin_29221753的博客 170

Hibernate.initialize 解决懒加载问题

Beyong超的博客 643

论文理解【LLM-OR】——【SIRL】Solver-Informed RL: Grounding Large Language Models for Authentic Optimization M

本文提出第一种针对基于 LLM 的 OR 问题建模和求解任务的 RLVR 方法,其基于求解器得到可验证奖励,设计了 Partial KL 强化目标函数和两阶段奖励课程训练方法,达成了 SOTA 性能

佚失的诗篇 880

Hibernate懒加载问题的5种解决方案

** 1、Hibernate基础 ** Hibernate基础,传送门 ** 2、什么是Hibernate懒加载 ** 当我们查询一个对象的时候,在默认情况下,返回的只是该对象的代理对象,当用户去使用该对象的属性时,才会向数据库再一次发出查询语句。 例如,有一个对象是Employee,还有一个对象是Department。显然,对于Employee相对Department来说,是多对一的关系;而对于...

zhaohong_bo的专栏 8079

为什么我把「大模型Clouder认证:基于百炼平台构建智能体应用」作为大模型学习的第一站?从 0 到拿证全流程经验分享

【摘要】作为一个刚拿下「大模型 Clouder 认证:基于百炼平台构建智能体应用」的过来人,想在开头就和大家聊聊这个认证的特殊意义 —— 在企业加速 AI 落地的今天,能用低代码快速构建智能体应用,已经成为 AI 从业者的核心竞争力。无论是企业微信客服提效、钉钉机器人自动化办公,还是网站智能助手升级,这些场景化能力正是当下数字化转型的刚需。

davidkorhenn的博客 1526

Unity工业数据可视化:基于ModbusTCP的实时数据通信实战

本文详细介绍了在Unity中实现工业数据可视化的核心方法,重点讲解了基于ModbusTCP协议与PLC等工业设备进行实时数据通信的实战流程。内容涵盖NModbus库的集成、Modbus Slave模拟器的使用、TCP连接的建立与多线程安全通信、数据读写与解析,以及如何将实时数据驱动3D场景,为构建工业数字孪生与监控系统提供完整解决方案。

ol7890123的博客 553

Hibbernate详解一

这里先做一个简单的入门,后面有详解 一、Hibernate简介 1、Hibernate在开发中所处的位置 2、ORM映射 Object :面向对象领域的 Relational:关系数据库领域的 Mapping:映射 mapping:就是将object和Relational联系起来。 二、搭建开发环境 1、下载Hibernate的资源包 前

敬业小码哥的博客 1458

基于 STM32 单片机的实验室多参数安全监测系统设计与实现

本系统以 STM32F103C8T6 单片机为核心,集成温湿度监测、烟雾检测、气体泄漏报警、人体移动监测等功能模块,通过 OLED 显示屏实时显示数据,并支持 Wi-Fi 远程传输。系统可对实验室异常环境参数(如高温、烟雾、燃气泄漏)及非法入侵实时报警,保障实验室安全。本文从硬件选型、电路设计到软件实现提供了完整的实验室安全监测系统方案,可根据实际需求调整传感器类型和通信方式,适用于科研、教学等场景的环境安全防护。:可增加继电器模块控制通风设备或切断电源,集成 ZigBee 组网实现多实验室联动监测。

weixin_42300449的博客 1285

使用OpenSessionInViewFilter后依然报错LazyInitializationException

现象: 在项目已经配置了OpenSessionInViewFilter,但是某一些请求依然报错: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of xxx, could not initialize proxy - no Session``` 网上找的解决懒加载异常的...

lpgqq的博客 313

2021-09-29 每天几个LCEDA小知识——如何交叉选择并阵列放置元器件

立创EDA专业版之交叉选择并阵列放置元器件????交叉选择????阵列放置 ????交叉选择 在原理图界面,先框选需要交叉选择的元器件对象,右键,选择交叉选择(如果熟练之后,直接选择元器件,快捷键Shift+X)。 完成上述操作之后,可以看到自动跳转到PCB绘图界面,并自动选定PCB中相关的元器件,接下来不要取消选择的状态,在相关元器件被选中的情况下,即可开展阵列放置,将这些元器件都放在一个区域,方便PCB画线前的布局工作。 ????阵列放置 在布局菜单栏中,选择分布,选择阵列分布, 在弹出的对话框

l64481000的博客 1463

【图像超分】论文精读:Enhanced Deep Residual Networks for Single Image Super-Resolution(EDSR和MDSR)

最近对超分辨率的研究随着深度卷积神经网络 (DCNN) 的发展取得了进展。特别是,残差学习技术表现出更好的性能。在本文中,我们开发了一个增强的深度超分辨率网络(EDSR),其性能超过了当前最先进的 SR 方法。我们模型的显着性能改进是由于通过删除传统残差网络中不必要的模块进行优化。当我们稳定训练过程时,通过扩展模型大小可以进一步提高性能。我们还提出了一种新的多尺度深度超分辨率系统(MDSR)和训练方法,该方法可以在单个模型中重建不同缩放因子的高分辨率图像。所提出的方法在基准数据集上比最先进的方法表现出更好的

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 7923

Grails - OpenSessionInView does not work with SiteMesh

grails 's bug description: http://jira.codehaus.org/browse/GRAILS-2764 fetchMode Purpose Allows the configuration of an associations fetch strategy ('eager' or 'lazy') Examples class Author { ...

robinfung的专栏 129

Android Framework WMS面试题及参考答案

什么是 WindowManagerService(WMS)?它的作用是什么? WindowManagerService(WMS)是 Android 系统中非常重要的一个系统服务。它运行在系统进程(system_server 进程)中。 从本质上来说,WMS 是 Android 窗口管理系统的核心。它负责管理系统中的所有窗口,包括应用程序窗口、系统窗口(如状态栏、导航栏)等。 它的主要作用有很多。首先是窗口的创建和销毁。当一个应用请求创建一个窗口时,WMS 会协调各个模块完成窗口的创建工

大模型大数据攻城狮的专栏 2162

Spring 的OpenSessionInViewFilter简介

假设在你的应用中Hibernate是通过spring 来管理它的session.如果在你的应用中没有使用OpenSessionInViewFilter或者 OpenSessionInViewInterceptor。session会在transaction结束后关闭。如果你采用了spring的声明式事务模式,它会对你的被代理对象的每一个方法进行事务包装(AOP的方式)。 <bean id="t...

qdoxford的专栏 248

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

使用OpenSessionInViewFilter解决懒加载问题

1.懒加载问题的出现原因: 注:在service中关闭的session,页面显示时,已经加载不了数据。 2.解决方案: 在过滤器中关闭session. web.xml配置 OpenSessionInViewFilter org.springframework.orm.hibernate3.support.OpenSessionInViewF

Arisan_code的专栏 794

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

懒加载(LAZY)在View层报错的解决方法: OpenSessionInViewFilter

在用到【fetch=FetchType.LAZY】的时候,会遇到一些问题。 比方说SpringMVC,在后台(M层)加载完数据以后,session就会随之关闭。这个时候由于懒加载(LAZY)的数据在后台没有被用到,所以没有获取。 如果在前台JSP(V层)想使用懒加载数据的时候,由于后台没有获取到想要加载的数据,系统就会报错。 为了在V层使用懒加载的数据,在前台读取数据的时候,session就

Royi的博客 2077

OpenSessionInViewFilter的作用及原理

Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常  (eg: org.hibe

张晓 1万+

Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题

Spring为我们解决最让人头痛的难题之一,Hibernate的Session的关闭与开启问题。 当hibernate+spring配合使用的时候,如果设置了lazy=true,那么在读取数据的时候,当读取了父数据后,hibernate会自动关闭session,这样,当要使用子

jCuckoo的专栏 1万+

Dubbo分布式服务框架常见问题解答汇总

1. 如果服务注册不上怎么办? (1) 检查dubbo的jar包有没有在classpath中,以及有没有重复的jar包 (2) 检查有没有重复的dubbo.properties配置文件 (3) 检查暴露服务的spring配置有没有加载 (4) 检查beanId或beanName有没有重复 (5) 查看有没有错误日志: cat ~/output/logs/webx

杨春建的博客 4万+

dubbo过滤器

什么是 dubbo 过滤器 学过servlet 或 spring mvc 的同学都知道有一个叫作过滤器的东西。顾名思义他就是用于过滤的。它本身不产生请求或者响应,它只是修改对某一资源的请求,或者修改某一资源的响应。 为什么需要 dubbo 过滤器 对于有些操作,我们可能每个接口都需要使用。比如打印接口调用的请求与响应信息,计算接口调用的时间。或者字符编码的转换。再或者就接口的权限判断。。。不胜枚举...

tinysakura的博客 2856

OpenSessionInView 的作用、配置及原理

hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。把一个Hibernate Session

broccoli2的博客 9199
上一篇: java责任链模式
下一篇: oracle学习笔记1
青蛙小王子
博客等级 码龄16年 239粉丝 311原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值