`

Hibernate lazy加载FOR Class

阅读更多
lazy策略可以用在:
 * <class>标签上:可以取值true/false
 * <property>标签上,可以取值true/false,这个特性需要类增强
 * <set>/<list>等集合上,可以取值为true/false/extra
 * <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy
 
 重要的概念:
 1、lazy的概念,指在需要的时候才发出sql
 2、lazy策略只是在session打开期间才是有效的
 
 注意:
 Hibernate类级别的lazy加载策略:可以控制什么时候加载这些普通对象属性
 
 测试单元的使用:
 请先运行初时化程序InitData,在执行每个单元测试
 

 

我们在这里暂时只测试lazy for class的情况

POJO:

package com.bjsxt.hibernate;

public class Group {
	
	private int id;
	
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	
}

 

group.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjsxt.hibernate.Group" table="t_group">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>	

 

生成数据类:

package com.bjsxt.hibernate;
import org.hibernate.Session;

import com.bjsxt.hibernate.Group;
import com.bjsxt.hibernate.HibernateUtils;


public class InitData {

	public static void main(String[] args) {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			Group group = new Group();
			group.setName("java开发组");
			session.save(group);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}

}

 

测试类:

package com.bjsxt.hibernate;

import org.hibernate.Session;

import junit.framework.TestCase;

/**
 * 运行本单元测试的前提条件:
 * 设置<class>标签中的lazy="true",或是保持默认(即不配置lazy属性)
 * 
 * @author Administrator
 *
 */
public class ClassLazyTest extends TestCase {

	public void testLoadGroup1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			
			//不会发出查询sql
			Group group = (Group)session.load(Group.class, 1);
			
			//不会发出查询sql
			System.out.println("group id=" + group.getId());
			
			//发出查询sql,加载数据到Group
			System.out.println("group name=" + group.getName());
			
			//不会发出查询sql
			System.out.println("group name=" + group.getName());
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}

	public void testLoadGroup2() {
		Session session = null;
		Group group = null;
		try {
			session = HibernateUtils.getSession();
			
			//不会发出查询sql
			group = (Group)session.load(Group.class, 1);
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			HibernateUtils.closeSession(session);
		}
		//不能正常输出,抛出了 LazyInitializationException,因为session已经关闭了
		//注意:Hibernate支持Lazy策略,只有session打开状态才有效		
		System.out.println("group name=" + group.getName());
		
	}
	
	
}

 

下面将class的lazy改为false

/**
 * 运行本单元测试的前提条件:
 * 设置<class>标签中的lazy="false",或是保持默认(即不配置lazy属性)
 * 
 * @author Administrator
 *
 */
public class ClassLazyTest extends TestCase {

	public void testLoadGroup1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			
			//会发出查询sql
			Group group = (Group)session.load(Group.class, 1);
			
			//不会发出查询sql
			System.out.println("group id=" + group.getId());
			
			//不会出查询sql,加载数据到Group
			System.out.println("group name=" + group.getName());
			
			//不会发出查询sql
			System.out.println("group name=" + group.getName());
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}

 

分享到:
评论

相关推荐

    hibernate的lazy策略forClass

    在这个场景中,我们关注的是"hibernate的lazy策略forClass",这涉及到如何对类的属性进行懒加载配置。 首先,我们需要理解Hibernate中的实体类(Entity)。在Hibernate中,一个Java类可以被映射为数据库中的一个表...

    gilead hibernate lazyload例子

    Gilead,全称为Hibernate for Flex,是用于Flex和Hibernate之间的数据绑定工具,它提供了一种在Flex客户端和Hibernate服务端之间通信的方法,使得Flex应用程序可以利用Hibernate的懒加载功能。然而,由于历史原因,...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    Hibernate延迟加载以及利用Spring

    - `lazy="proxy"`:表示Hibernate将为`Dept`实体创建一个代理对象,只有当真正访问到`Dept`对象的相关属性时,Hibernate才会发起数据库查询,加载实际的`Dept`对象。 - `fetch="select"`:默认值,表示在查询`Emp`时...

    hibernate 延迟加载深入剖析

    ### Hibernate延迟加载深入剖析 #### 一、概述 在现代软件开发中,特别是与数据库交互的应用场景下,Hibernate作为一款流行的Java持久层框架,提供了多种高效处理数据的技术。其中,延迟加载(Lazy Loading)是一...

    hibernate延迟加载解决

    要在Hibernate中启用实体对象的延迟加载,需要在映射文件中为相应的类添加`lazy="true"`属性,例如: ```xml &lt;class name="com.neusoft.entity.User" table="user" lazy="true"&gt; ... &lt;/class&gt; ``` **工作原理:**...

    Hibernate 延迟加载剖析与代理模式应用

    在实际运行中,当我们通过`session.get(Person.class, 1)`获取一个`Person`对象时,如果没有明确地访问`addresses`,Hibernate只会加载`Person`的基本信息,而不会加载与之关联的`Address`集合。在调试模式下,我们...

    hibernate懒加载策略.doc

    例如,在上述配置中,`&lt;class&gt;`标签的`lazy`属性设为`true`,表示User实体将采用懒加载。 - 当使用`session.load()`方法获取对象时,返回的不是实际的实体对象,而是该对象的一个代理类。这个代理类由Hibernate通过...

    Hibernate延迟加载介绍.doc

    Hibernate作为Java领域中的一个强大的对象关系映射框架,提供了许多优化数据库操作的策略,其中之一便是延迟加载(Lazy Loading)。延迟加载机制旨在减少不必要的性能消耗,只在真正需要数据时才执行加载操作。本文...

    hibernate延迟加载

    为了提高应用程序性能,Hibernate 提供了多种优化手段,其中“延迟加载(Lazy Loading)”是一种非常重要的性能优化技术。本文主要探讨 Hibernate 中的延迟加载机制及其具体应用场景。 #### 二、基本概念 延迟加载...

    hibernate延迟加载技术详细解

    在 Hibernate 框架中,延迟加载(Lazy Loading)是一种非常重要的优化技术,它能够有效地减少数据库查询次数,提高应用性能。通常,在多对多或者一对多的关系中,延迟加载能够避免 N+1 查询问题。本文将详细探讨 ...

    Hibernate的延迟加载

    在Hibernate中启用实体对象的延迟加载,需在实体的映射配置文件中设置`lazy="true"`属性。例如: ```xml &lt;hibernate-mapping&gt; &lt;class name="net.ftng.entity.user" table="user" lazy="true"&gt; ... &lt;/class&gt; &lt;/...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    Hibernate延迟加载

    Hibernate延迟加载是ORM框架Hibernate中的一个重要特性,它旨在提高应用程序的性能和效率。延迟加载(Lazy Loading)策略允许我们仅在需要访问一个对象或其属性时才从数据库加载它们,而不是在初始加载实体时就一次...

    浅谈解决Hibernate懒加载的4种方式

    2. 修改对象关系文件:将lazy改写lazy=false,即关闭懒加载。这也可以解决问题,但是也存在同样的缺点。 3. 使用过滤器:在web项目中使用过滤器,可以在请求结束时关闭session,从而解决懒加载问题。这种方法可以...

    Hibernate懒加载之&lt;class&gt;标签上的lazy

    总结起来,Hibernate的懒加载通过`&lt;class&gt;`标签的`lazy`属性实现了对象实例的延迟初始化,只加载必要的主键信息,其余属性在需要时按需加载,从而节省了内存资源和数据库操作,提高了系统效率。在实际开发中,合理...

Global site tag (gtag.js) - Google Analytics