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


相关文章
|
3月前
|
Java 数据库连接 数据库
|
Java 数据库连接 Spring
Hibernate延迟加载问题
  Hibernate延迟加载是项目中非常常用的技术。通过使用Hibernate延迟加载机制可以在加载数据是不必加载全部数据,而是只加载我们需要的那部分,其余部分在需要使用时才从数据库装载,以此来减少数据量提高系统性能。
1060 0
|
SQL 缓存 Java
Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)
  假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下:   假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: 1 Session session=HibernateUtil.
1273 0
|
Java 数据库连接 数据库
Hibernate的延迟加载
 ----------------------------------------------  一 ------------------------------------------- 转自:http://blog.csdn.net/java958199586/article/details/7069901 hibernate延迟加载(懒加载)详解 一.什么是懒加载?他的作
1257 0
|
SQL Java 数据库连接
hibernate 延迟加载
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。
784 0
|
Java Spring 数据库连接
hibernate 延迟加载的错误 failed to lazily initialize a collection of role
这个问题一般出现在一对多的情况下,解决的方法有两种1、设置lazy=false如果是用annotation,则配置如下@OneToMany(   targetEntity = CourseAuthorizationItem.class,   cascade = {CascadeType.PERSIST, CascadeType.MERGE},   mappedBy = "course",
2260 0
|
SQL Java 数据库连接
Hibernate延迟加载
1、类级别的延迟加载  1、   是通过session.load方法实现的    在映射文件中:     &lt;class name="cn.itcast.hibernate717.lazy.Customer" table="customer" catalog="test" lazy="true"&gt;      lazy表示延迟加载    2、   当映射文件中,class元素的属性la
1068 0
|
Java 数据库连接 数据格式
Hibernate延迟加载问题
Hibernate的映射配置单如下: DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.
853 0
|
SQL Java 数据库连接