Hibernate lazy load.

2023-11-13

HIBERNATE的持久化对象加载策略。
延迟加载, 也就是用到的时候才去加载.这样可以提高一些性能.
Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是hibernate.org并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。

比如在我们的应用中,user->post形成一对多的映射,User中有一个包含post的List。
在User中,有多个属性:name,password,phone等,还有一个List类型的posts。当我们对posts使用lazy laoding的时候,hibernate会在获得User对象的时候,仅仅返回name,password,phone等基本属性,当你访问posts的时候,它才会从数据库中提取posts需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session已经close了,再进行lazy loaiding就会有异常。
解决办法是在close session之前,调用Hibernate.initialize(user.getPosts()),告诉系统,user.getPosts()是需要lazy laoding的。但是这样做会破坏HibernateSession类的封装.
后来采用所谓的OpenSessionInView模式,把session的周期交给servlet filter来管理,每当有request进来,就打开一个session,response结束之后再关闭它,这样可以让session存在于整个请求周期中。


Hibernate中Lazy延迟加载
Hibernate有关one-to-one和many-to-one在查询中的父亲端lazy问题
Hibernate3在关联上有lazy这个属性,如果是Hibernate2,应该是设置outer-join="false",然后被关联的对象,在class那个地方设置lazy="true".首先,对于many-to-one的问题,可以在父亲端的class标签中设置lazy来解决,这样,在查询儿子的时候,不会发送多余的sql .
对于one-to-one,在hibernate2里面,由于one-to-one里面没有lazy的选项,所以只能通过设置outer-join="false"来解决。而hibernate3已经加入了lazy,所以不会有这个问题。
总体来说,如果你发现你查询儿子的时候,有多余的sql发送,那一定是你对hibernate的误用..


在hibernate 的one-to-many,many-to-one,many-to-many中,为了效率的提高,我们一般都采用lazy机制,但使用spring的getHibernateTemplate().save(Object)时,HibernateTemplate试图每次在execute之前去获得Session,执行完就力争关闭Session 。也就是说Hibernate的Lazy初始化1:n关系时,你必须保证是在同一个Session内部使用这个关系集合,不然Hiernate将抛出Failed to lazily initialize a collection - no session or session was closed的例外。


Hibernate中的对象的关联(association)的设置还是不够灵活,实际应用中有的地方需要lazy load,有的地方又不需要,其实还有的地方就根本不需要使用association。而在Hibernate中,只能在影射文件中设置一种方式,像我们这样的应用,我是不敢轻易使用open session in view的(慢点总比lock住要好),只能是要么不设置association,要么就是lazy=true的。以前的分类信息只用了一个many to one的关系,代价还可以忍受,但现在关系越来越复杂了,再多加几个的话,所要付出的performance,带宽等方面的代价恐怕就不能忽略了,即使使用cache提高一点performance,对带宽的浪费也还是不可原谅的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate lazy load. 的相关文章

随机推荐

  • Django 缓存机制 Redis缓存

    Django 提供6种缓存方式 1 开发调式缓存 2 内存缓存 3 文件缓存 4 数据库缓存 5 Memcache缓存 使用Python memcached模块 6 Memcache缓存 使用pylibmc模块 常用的缓存方式是 文件缓存
  • 5g信令流程详解_5G无线网络信令流程

    招个电子工程师 招个电子工程师 一个只专注电子工程师精准招聘的服务 精准 快速 高效 低成本 这是 招个电子工程师 服务的精髓 如果您的技术团队需要扩军 那么 热烈欢迎各大中小企业的HR和招聘负责人与我们联系 具体合作详情请咨询 管理员微信
  • Compose 动画边学边做 - 夏日彩虹

    引言 Compose 在动画方面下足了功夫 提供了种类丰富的 API 但也正由于 API 种类繁多 如果想一气儿学下来 可能会消化不良导致似懂非懂 结合例子学习是一个不错的方法 本文就带大家边学边做 通过高仿微博长按点赞的彩虹动画 学习和实
  • 初学者如何快速练习盲打

    初学者如何快速练习盲打 2012 05 22 15 25 54 转载 标签 打字练习 初学者 手感 杂谈 分类 计算机技巧 盲打要求的是对键盘的熟练 是感觉上的东西 当你看到一句话想到的不应该是每个字有哪个拼音 有那个字母 而是像 手感 一
  • sonar扫描时报Failed to upload report - An error has occurred. Please contact your administrator

    本人新学习使用此软件 参考网络各大神资料后解决问题方法如下 此问题产生的原因在于mysql的max allowed packet 参数限制默认为4M 将设置进行修改就可以了 mysql根据配置文件会限制server接受的数据包大小 有时候大
  • 【应届生必看】技术岗面试应答有哪些话术和技巧?

    很多时候 面试过程中A与B两人工作经历 能力都相差不大时 A能脱颖而出的大部分原因是在面试过程中表现出的较高的情商 稳定性和与企业文化匹配的性格 价值观等 求职者从各项提问中了解面试官想要考察的主旨 根据自己实际情况适当地进行总结和梳理 以
  • Linux操作系统学习,Linux基础命令大全

    目录 第一章 Linux简介和安装 1 1 Linux简介和分类 1 2 安装VMware虚拟机 在虚拟机中安装CentOS 7 第二章 虚拟机中Linux的IP地址配置详解 2 1 什么是IP地址 如何查看 2 2 虚拟机NAT模式中Li
  • JCR分区与中科院分区详解-中科院基础版和升级版详解

    https baijiahao baidu com s id 1642002458698070188 wfr spider for pc JCR分区 科睿唯安每年出版JCR 期刊引用报告 JCR将收录的期刊分为176个不同学科类别 每个学科
  • ubuntu安装NERDTree,Taglist和WinManager

    在ubuntu中要用vim进行开发的话 这三个插件组合在一起 给你一种顺滑的感受 NERDTree NERDTree的安装 nerdtree可以显示当前项目的文件结构 安装方法如下 执行以下命令即可 1 创建文件夹 mkdir vim 如果
  • 线性代数的本质(五)——矩阵的运算

    文章目录 矩阵的运算 矩阵的转置 方阵的运算 初等矩阵 分块矩阵 逆矩阵 矩阵的秩 广义逆矩阵 矩阵的运算 矩阵的转置 转置 矩阵 A A A的行列互换得到的矩阵称为 A A A 的转置 transpose 记作
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】最佳植树距离

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 最佳植树距离 知识点二分查找 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 按照环保公司要求 小明需要在沙化严重的地区进行植树防沙工作 初步目标是种植一条直线的树带
  • git报错:error: RPC failed; curl 18 transfer closed with outstanding read data remaining

    今天和朋友聊天 推荐了个项目给我看看 在克隆的过程中发现太大拉不下来 报错如下 error RPC failed curl 18 transfer closed with outstanding read data remaining 远程
  • 黄金矿工(Java)

    先来一张效果图 图片资源 https pan baidu com s 1weCGFLQlzOTvDRY18bizrg pwd ivjt 提取码 ivjt 该项目一共12个类 均处于同一目录 首先是基类 其余用来表示物体的类都继承它 impo
  • Tensorflow 1.13训练模型.pb文件转换成Tensorflowlite可以使用的.tflite文件过程记录

    Tensorflow 1 13训练模型 pb文件转换成Tensorflowlite可以使用的 tflite文件过程记录 前言 之前一直通过1 13版本的TensorflowGpu训练模型 使用范围局限在电脑端 例如opencv调用模型等等
  • unity游戏开发-socket网络通信

    本篇主要是分享基于unity的客户端socket网络通信方案 关于服务器的c socekt搭建放在了这里 基于C 的Tcp服务端通信 其中关于socekt粘包断包的处理放在这里分享了 C socket粘包断包处理 目录 整体设计 TcpCl
  • Spring Security Oauth2 认证(获取token/刷新token)流程(password模式)

    1 本文介绍的认证流程范围 本文主要对从用户发起获取token的请求 oauth token 到请求结束返回token中间经过的几个关键点进行说明 2 认证会用到的相关请求 注 所有请求均为post请求 获取access token请求 o
  • BUUCTF WEB刷题记录

    第一题 刚打开的页面 看源码 发现source php 访问source php 我们要用file参数带出flag 但是有白名单限制 第一个和第二个判断是对file本身的值进行判断 第三个和第四个是对 前面的file值进行判断 所以我们可以
  • jeecg-boot字典翻译改造(支持实体类详情查询自动翻译)

    找到字典切面类 DictAspect 改造方法 parseDictText 支持自动生成的列表接口 单个实体类查询翻译 代码如下 private void parseDictText Object result if result inst
  • 2023 最新版IntelliJ IDEA 2023.1创建Java Web前(vue3)后端(spring-boot3)分离 项目详细步骤(图文详解)

    文章目录 接上篇 项目构建所需的相关工具 Java IDEA maven NodeJS Vue Visual Studio Code 后端项目创建详细步骤 1 开始创建新项目 2 输入项目名称 选择项目存储位置 项目管理工具 Maven 选
  • Hibernate lazy load.

    HIBERNATE的持久化对象加载策略 延迟加载 也就是用到的时候才去加载 这样可以提高一些性能 Hibernate的lazy loading 采用了一个HibernateSession来管理session 它的逻辑是每进行一次数据库操作