Hibernate延迟加载问题

  Hibernate延迟加载是项目中非常常用的技术。通过使用Hibernate延迟加载机制可以在加载数据是不必加载全部数据,而是只加载我们需要的那部分,其余部分在需要使用时才从数据库装载,以此来减少数据量提高系统性能。

  Hibernate延迟加载大致可以分为两类,一类是延迟属性加载,另一类是延迟关联实体加载。

属性加载

  属性加载又可以分为两类,一类是集合属性,一类是非集合属性。

关联加载

  关联加载也分两种情况,一种是多对一,另一种是一对一。

  今天遇到的问题属于关联加载的,A、B部门属于关联部门,B属于A的子部门,当查询B部门的时候并没有用的A部门的相关属性,所以为了保证性能我们并没有将A部门的信息加载到页面。但是当我们在B部门页面点击”返回上一级“按钮是,需要传入一个A部门的ID,这时候B部门信息已经显示到页面,相关的session已经关闭了,系统会抛出异常,错误信息如下:

  

解决办法:

(1)将延迟加载属性设置为false

  

  这种方法最简单,但是这样我们就不能用hibernate的延迟加载机制了,也就是说每次加载都有可能加载很多用不到的数据,影响系统性能,这是不推荐的。

(2)在web.xml中配置openSessionInViewFilter这个过滤器,必须将openSessionInViewFilter过滤器配置中Struts2核心过滤器之前。

<!-- 配置Spring的用于解决懒加载问题的过滤器 -->
    <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>*.action</url-pattern>
    </filter-mapping>  

  
  过滤所有的*.action。这种方法,让session关闭延迟在界面层才关闭。这样在界面取数据的时候就不会报错啦。

时间: 2024-10-25 11:36:17

Hibernate延迟加载问题的相关文章

对象被json格式化时,hibernate 延迟加载将所有对象都查了出来。

问题描述 对象被json格式化时,hibernate 延迟加载将所有对象都查了出来. 对象被json格式化时,hibernate 延迟加载将所有对象都查了出来, 如何在json格式化时不适用get方式? 解决方案 在线等不知道有啥好的方法 解决方案二: jackson json,用于hibernate的懒加载对象级联关系的json解析 解决方案三: 你好! 如何这样的话如果我用到了延迟加载呢?有没有更好的办法?

Hibernate延迟加载技术详解_java

本文实例讲述了Hibernate延迟加载技术.分享给大家供大家参考,具体如下: Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载.Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能. 下面先来剖析 Hibernate 延迟加载的"秘密". 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性

Hibernate延迟加载原理与实现方法_java

本文实例讲述了Hibernate延迟加载原理与实现方法.分享给大家供大家参考,具体如下: 为了进一步优化Hibernate的性能,可以使用: 延迟加载技术.管理数据抓取策略.进行缓存管理 等方面考虑来提高Hibernate的性能. 1. 延迟加载(load) 延迟加载(load)是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建. 延迟加载的过程:通过代理(Proxy)机制来实现延迟加载.Hibernate从数据库获取某一个对象数据时.获取某一个对象的集

关于Hibernate延迟加载的问题

问题描述 遇到一个问题,例如:public Class Parent{ private String id; //other fields ... public Parent(){} //setters & getters ... public boolean equals(Object o){ //核心是判断两个对象的id是否一样 .... }}public Class Child{ private String id; private Parent parent; //other field

Hibernate延迟加载

1.类级别的延迟加载  1.   是通过session.load方法实现的    在映射文件中:     <class name="cn.itcast.hibernate717.lazy.Customer" table="customer" catalog="test" lazy="true">      lazy表示延迟加载    2.   当映射文件中,class元素的属性lazy为false时,session

java web 开发中hibernate延迟加载如何应用

问题描述 我想请教一下hibernate的延迟加载在webapp应用中能应用在哪些地方.web应用中页面取数据都是一次加载完成.有操作的话都是另外一次请求,如何应用延迟加载. 问题补充:延迟加载的概念我是了解的.我的意思是如果在页面上先显示出来class,等我需要看这个class里面有多少user的时候再使用延迟加载,那该如何实现.因为在页面上的任何操作都会触发action > service > dao,其实就是如何跨action实现延迟加载.我能想到的就是把po存在session里,不过这

java Hibernate延迟加载_java

示例数据表:team(班级).certificate(身份证).student(学生)Team.hbm.xml<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hiber

hibernate 延迟加载的错误 failed to lazily initialize a collection of role

这个问题一般出现在一对多的情况下,解决的方法有两种1.设置lazy=false如果是用annotation,则配置如下@OneToMany(   targetEntity = CourseAuthorizationItem.class,   cascade = {CascadeType.PERSIST, CascadeType.MERGE},   mappedBy = "course", fetch=FetchType.EAGER  )将fetch类型设置成直接获取 2.就是使用fil

Hibernate和Spring的延迟加载和DAO模式

Hibernate和延迟加载 Hibernate对象关系映射提供了两种对象初始化模式:延迟加载和非延迟加载.非延迟加载在加载时获取对象本身以及它关联的所有对象.这可能导致在获取一个实例时,执行成百上千的select语句.当使用双向关联时,这个问题被放大,常常出现初始化请求时,整个数据库都被载入.显然检查每个对象的关系,并手工删除他们会费点事,但最终我们可能会因此丢失使用ORM工具的优势.一个明细的解决方式是使用hibernate提供的延迟载入机制.这种初始化策略在类成员被访问时只载入它的一个对象