Hibernate的延迟加载问题

简介:

 

 

 

一、延迟加载及作用?
    延迟加载又叫懒加载。是指在访问数据时,当数据用到的时候才被加载,没有被用到的时候不加载。
二、这样做有什么好处呢?
    好处就是每次访问数据的时候,因为只加载需要的数据,这样就可以降低数据库以及内存压力。
    虽然说有时候整体的数据量并不多,但是这是一种机制,当数据量比较大的时候,对整体项目或者
    方法调用的优化就会有明显的效果。

三、hibernate中get方法和load方法区别?
    1、hibernate中,对于get方法,是立即加载的,也就是会立刻从数据库中查询出数据,有数据就直接返回这个
    数据,如果没有对应的数据就会返回null;
    而hibernate对于load方法,并不是立即去加载的,hibernate会认为要查询的数据一定存在,所以会通过CGLIB生成一个代理对象,
    当在使用到该对象的属性的时候才会去查询数据库,但是此时如果数据库中不存在该对象,就会抛出异常:
    ERROR LazyInitializer:63 - Exception initializing proxy(还有一种情况会出现此异常:当session关闭之后再调用该对象中的属性   时, 一般这种情况发生在view层调用该对象的属性,因为此时session已经是关闭的了的)。
    所以在使用load方法抛出异常并不是因为创建对象引起的,而是因为
    调用了该对象中的属性引起的。
    2、查询时涉及缓存:
      对于get方法,hibernate会先查询一级缓存session,然后查询二级缓存,如果还没有的话就会去查询数据库,如果数据库
      中还有就返回null;
      对于load方法,hibernate会先查询一级缓存session,没有的话,就会创建代理对象,当使用实际数据时才会去查询二级
      缓存和数据库。

四、解决延迟初始化错误的方法:
    产生错误的原因:
      延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略,
      那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。
      如果在游离状态时才初始化它,就会产生延迟初始化错误。
解决方法:
  1、不去将延迟加载对象进行初始化。
      如果是一个对象中的属性可以将其忽略初始化:
      配置:在该属性的set方法上添加注解:@JSON(serialize=false)
  2、将延迟加载的属性在配置中配置为立即加载:lazy=false,lazy属性默认是true;
  3、在业务层session关闭之前,对延迟对象初始化。
  4、OpeanSessionView配置 :OpenSessionInViewFilter,可将session开启到表现层。
配置如下:
    
<!-- OpenSessionInViewFilter必须配置在Struts2 Filter之前  -->
    <filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 

本文转自 兴趣e族 51CTO博客,原文链接:http://blog.51cto.com/simplelife/1695693


相关文章
|
1月前
|
存储 缓存 Java
【MyBaits】4、延迟加载、MyBatis 的缓存
【MyBaits】4、延迟加载、MyBatis 的缓存
22 0
|
3月前
|
Java 数据库连接 mybatis
Mybatis中延迟加载~
Mybatis中延迟加载~
|
Java 数据库连接 数据库
【MyBatis】学习笔记13:延迟加载(懒加载)
【MyBatis】学习笔记13:延迟加载(懒加载)
105 0
【MyBatis】学习笔记13:延迟加载(懒加载)
|
Java 数据库连接 数据库
mybatis学习(55):延迟加载
mybatis学习(55):延迟加载
84 0
|
SQL Java 数据库连接
|
SQL Java 数据库连接
MyBatis入门-延迟加载与立即加载
MyBatis入门-延迟加载与立即加载
220 0
MyBatis入门-延迟加载与立即加载
|
SQL Java 数据库连接
【MyBatis框架点滴】——MyBatis延迟加载
 延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。——摘自百度百科《延迟加载》
【MyBatis框架点滴】——MyBatis延迟加载
|
SQL Java 数据库连接
Mybatis:高级知识2- 延迟加载
Mybatis:高级知识2- 延迟加载
182 0
Mybatis:高级知识2- 延迟加载
|
SQL 存储 缓存
Mybatis学习第四天:Mybatis延迟加载懒加载,一级缓存,二级缓存,注解开发
Mybatis学习第四天:Mybatis延迟加载懒加载,一级缓存,二级缓存,注解开发
Mybatis学习第四天:Mybatis延迟加载懒加载,一级缓存,二级缓存,注解开发
|
存储 SQL 缓存
Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
  踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮。
236 0