2019独角兽企业重金招聘Python工程师标准>>>

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,对带宽的浪费也还是不可原谅的。

转载于:https://my.oschina.net/91jason/blog/304055

hibernate lazy加载相关推荐

  1. Hibernate懒加载解析

    Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...

  2. (10) Hibernate懒加载详解

    懒加载为hibernate中比较常用的特性之一,下面我们详细来了解下懒加载的原理和注意事项 Load()方法的懒加载原理 在Hibernate中,查询方法有两个,分别是get()和load(),这两种 ...

  3. 对Hibernate赖加载对象在session容器之外的获取方法

    作者:xyzroundo Hibernate赖加载指定的是在持久化上下文(session实例)中,依赖对象被用到的时候才对数据库查询该对象. 然而,但脱离了session实例(可能是序列化到客户端:可 ...

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

    ** 1.Hibernate基础 ** Hibernate基础,传送门 ** 2.什么是Hibernate懒加载 ** 当我们查询一个对象的时候,在默认情况下,返回的只是该对象的代理对象,当用户去使用 ...

  5. hibernate 懒加载_Hibernate懒/急加载示例

    hibernate 懒加载 这篇文章将重点讨论为什么以及如何在应用程序中使用称为LAZY和EAGER加载的概念,以及如何使用Spring的Hibernate模板以EAGER方式加载LAZY实体. 当然 ...

  6. Hibernate懒加载问题

    刚开始接触这种数据持久化框架时,使用的是Maybatis,相较于最原始的JDBC+SQL模式,Maybatis简直就是神器,特别是在用过Maybatis动态SQL后,简直就开始对Maybatis爱不释 ...

  7. Java hibernate假外键_浅谈hibernate急迫加载问题(多重外键关联)

    数据库结构如下 strategy中有外键member_id(关联member表)外键strategy_category(关联category表)而member表中有外键position_id(关联po ...

  8. Hibernate懒加载

    在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而 ...

  9. Hibernate延时加载

    首先说明Hibernate3延迟加载只对load,get,find一些内值方法有用,对hql等写sql的无效.   延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据 ...

最新文章

  1. Vert.x 发送邮件
  2. 远程实习 | 达特茅斯学院招收网络嵌入和图挖掘方向研究型实习生
  3. 修改路由表来使路由分流
  4. 形象!Google Earth增实时雨雪演示功能
  5. mysql seconds_behind_master_MySQL 复制延迟 Seconds_Behind_Master 究竟是如何计算的
  6. 向上造型和向下造型_国标舞So easy?!亲,你怕是凹错造型咯~
  7. (7)哈希表的链地址法实现
  8. centos8平台用NetworkManager/nmcli管理网络
  9. windows 下 新建 点开头的文件和文件夹
  10. linux scp 非22端口,[ssh scp sftp] 连接远程ssh非22端口的服务器方法
  11. SharePoint下载服务器资源
  12. RoaringBitMap学习和实践
  13. 带选择头像的用户注册页面
  14. intent跳转和转场动画
  15. Unity中抛物线的实现
  16. 公众号文章留言评论功能开通方法(详解)
  17. DNS,二级域名泛解析
  18. [C++]C++中的延时方法总结
  19. PFM,PPM,PWM解释
  20. 服务器虚拟化优缺点总结

热门文章

  1. 自动化测试报告 html模板,PyTestReport 自动化测试报告框架
  2. vlan的基本指令_10、Vlan的基本常用命令
  3. 如何设置电脑锁屏时间_电脑如何设置多屏显示?多屏显示的设置方法
  4. shell 登录mysql 然后quit_使用工具Xshell实现在linux上登录mysql和退出mysql的相关操作讲解...
  5. 不需要网络的调频收音机_测试工程师真的不需要懂网络知识么?
  6. python加密执行_如何在Python中执行PGP(生成密钥,加密/解密)
  7. hadoop 开启防火墙_Hadoop部署一Hadoop安装
  8. openstack——使用命令行删除租户所有信息
  9. python 冷门_csvkit---python一个牛逼到不行的csv处理库
  10. Asp.Net Core 之 appsettings.json