`

hibernate学习8之lazy策略

阅读更多
hibernate lazy策略可以使用在:
* <class>标签上,可以取值:true/false
* <property>标签上,可以取值:true/false需要类增强工具
* <set><list>标签上,可以取值:true/false/extra
* <one-to-one><many-to-one>单端关联上,可以取值:false/proxy/noproxy

lazy概念:只有真正使用该对象时,才会创建,对于hibernate而言,正真使用的时候才会发出sql

hibernate支持lazy策略只有在session打开状态下有效

<class>标签上的lazy特性只对普通属性起作用


集合上的lazy策略

import org.hibernate.Session;

import junit.framework.TestCase;

/**
 * 运行本单元测试的条件:
 * 	
 * 设置<class>标签上的lazy=true,也就是默认配置
 *  
 * @author Administrator
 *
 */
public class ClassLazyTest extends TestCase {

	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			Group group = (Group)session.load(Group.class, 1);
			
			//不会发出sql
			System.out.println("group.id=" + group.getId());
			
			//会发出sql
			System.out.println("group.name=" + group.getName());
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	

	public void testLoad2() {
		Session session = null;
		Group group = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			group = (Group)session.load(Group.class, 1);
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		//不能正确输出,抛出LazyInitializationException 异常,因为session已经关闭
		//hibernate支持lazy策略只有在session打开状态下有效
//在Spring中设置openSessionInViewFilter可以解决这个问题。
		System.out.println("group.name=" + group.getName());
	}	
	
}


hibernate在集合上的lazy策略,可以取值:true/false/extra

<class>标签上的lazy不会影响到集合上的lazy特性
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import junit.framework.TestCase;

import org.hibernate.Session;

/**
 * 保持lazy默认
 * @author Administrator
 *
 */
public class CellectionlazyTest1 extends TestCase {


	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			Classes classes = (Classes)session.load(Classes.class, 1);
			
			//会发出sql
			System.out.println("classes.name=" + classes.getName());
			
			//不会发出sql
			Set students = classes.getStudents();
			
			//会发出sql
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println("student.name=" + student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testLoad2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			Classes classes = (Classes)session.load(Classes.class, 1);
			
			//会发出sql
			System.out.println("classes.name=" + classes.getName());
			
			//不会发出sql
			Set students = classes.getStudents();
			
			//会发出sql,发出查询全部数据的sql
			System.out.println("student.count=" + students.size());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
}


设置集合上的lazy=false,其它默认
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import junit.framework.TestCase;

import org.hibernate.Session;

/**
 * 设置集合上的lazy=false,其它默认
 * @author Administrator
 *
 */
public class CellectionlazyTest3 extends TestCase {


	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			Classes classes = (Classes)session.load(Classes.class, 1);
			
			//会发出sql,会发出两条sql分别加载Classes和Student
			System.out.println("classes.name=" + classes.getName());
			
			//不会发出sql
			Set students = classes.getStudents();
			
			//不会发出sql
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println("student.name=" + student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testLoad2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			Classes classes = (Classes)session.load(Classes.class, 1);
			
			//会发出sql,会发出两条sql分别加载Classes和Student
			System.out.println("classes.name=" + classes.getName());
			
			//不会发出sql
			Set students = classes.getStudents();
			
			//不会发出sql
			System.out.println("student.count=" + students.size());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
}



设置集合上的lazy=extra(推荐),其它默认
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import junit.framework.TestCase;

import org.hibernate.Session;

/**
 * 设置集合上的lazy=extra,其它默认
 * @author Administrator
 *
 */
public class CellectionlazyTest4 extends TestCase {

	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			Classes classes = (Classes)session.load(Classes.class, 1);
			
			//会发出sql
			System.out.println("classes.name=" + classes.getName());
			
			//不会发出sql
			Set students = classes.getStudents();
			
			//会发出sql
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println("student.name=" + student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testLoad2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			Classes classes = (Classes)session.load(Classes.class, 1);
			
			//会发出sql
			System.out.println("classes.name=" + classes.getName());
			
			//不会发出sql
			Set students = classes.getStudents();
			//会发出sql,发出一条比较智能的sql
			System.out.println("student.count=" + students.size());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
}


单端关联上的lazy策略
import org.hibernate.Session;

import junit.framework.TestCase;

/**
 * 所有lazy属性默认
 * @author Administrator
 *
 */
public class SingleEndTest1 extends TestCase {
	
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			User user = (User)session.load(User.class, 1);
			
			//会发出sql
			System.out.println("user.name=" + user.getName());
			
			//不会发出sql
			Group group = user.getGroup();
			
			//会发出sql
			System.out.println("group.name=" + group.getName());
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
}


import org.hibernate.Session;

import junit.framework.TestCase;

/**
 * 将<many-to-one>中的lazy设置为false,其它默认
 * @author Administrator
 *
 */
public class SingleEndTest2 extends TestCase {
	
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//不会发出sql
			User user = (User)session.load(User.class, 1);
			
			//会发出sql,发出两条sql分别加载User和Group
			System.out.println("user.name=" + user.getName());
			
			//不会发出sql
			Group group = user.getGroup();
			
			//不会发出sql
			System.out.println("group.name=" + group.getName());
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
}



import org.hibernate.Session;

import junit.framework.TestCase;

/**
 * <class>标签上的lazy=false,其它默认
 * @author Administrator
 *
 */
public class SingleEndTest3 extends TestCase {
	
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//会发出sql
			User user = (User)session.load(User.class, 1);
			
			//不会发出sql
			System.out.println("user.name=" + user.getName());
			
			//不会发出sql
			Group group = user.getGroup();
			
			//会发出sql
			System.out.println("group.name=" + group.getName());
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
}
分享到:
评论

相关推荐

    hibernate在集合上的lazy策略

    标题“hibernate在集合上的lazy策略”指的是Hibernate如何处理与实体相关的集合类(如List、Set等)的懒加载。这篇文章可能详细解释了Hibernate在集合懒加载方面的实现方式以及其背后的原理。 懒加载的主要目的是...

    hibernate的lazy策略forClass

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

    hibernate学习资料大全

    【hibernate学习资料大全】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。...希望这些资料能对CSDN的网友们在Hibernate学习之路上提供宝贵的帮助。

    hibernate学习总结文档

    **Hibernate 框架概述** Hibernate 是一个开源的对象关系映射(ORM)框架,它为 Java 开发者提供了一种在 Java 应用程序中管理关系...通过实践和深入学习,你可以更好地利用 Hibernate 实现高效、可靠的数据库应用。

    HIBERNATE检索策略

    这是HIBERNATE默认的抓取策略,当一个实体被加载时,与之关联的实体或集合并不会立即加载,而是采用延迟加载(Lazy Loading)的方式。当第一次访问关联实体或集合时,HIBERNATE会额外发送一条SELECT语句来抓取数据,...

    Hibernate学习笔记

    【Hibernate学习笔记】 在深入探讨Hibernate之前,先要理解什么是持久化对象的状态。持久化对象在Hibernate中有三种状态:瞬时(Transient)、持久化(Persistent)和离线(Detached)。瞬时对象是指通过`new`操作...

    hibernate学习资料

    10. **懒加载(Lazy Loading)**:一种优化策略,只有当实际需要访问关联对象时,才会执行数据库查询,避免了无谓的性能开销。 11. **事件监听器(Event Listeners)**:允许自定义逻辑在特定的生命周期事件(如...

    Hibernate学习源码

    源码包中的各个文件代表了Hibernate学习的不同阶段,如Hibernate10_0603、Hibernate8_0601等,这些命名可能表示不同的学习日期或版本。每个文件夹内通常会包含配置文件(如hibernate.cfg.xml)、实体类(Entity)、...

    hibernate3学习总结

    【hibernate3学习总结】 Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。在学习 Hibernate 3 时,主要关注以下几个核心知识点: 1. **Hibernate 核心接口**...

    Hibernate3.2学习笔记

    本篇学习笔记将深入探讨Hibernate3.2的核心概念,包括环境搭建、主要接口、映射方式以及性能优化策略。 首先,让我们从搭建Hibernate3.2开发环境开始。在创建一个新的Java项目后,我们需要添加必要的库文件,主要...

    J2EE系统之-hibernate学习总结

    ### J2EE系统之-hibernate学习总结 #### 对象持久化理论 - **对象持久化定义**:将对象中的数据转换存储至外部持久性存储设备的过程,如数据库、磁盘等。 - **对象持久化的原因**: - 内存易失性:断电后数据丢失...

    hibernate学习笔记

    get 和 load 方法的区别在于对懒加载(lazy loading)的支持,get 直接加载数据,而 load 支持延迟加载。如果 get 无法找到数据,则返回 null;load 则会抛出异常。 transient 状态的特征是数据库中没有对应记录,...

    Hibernate3.3_学习笔记.doc.zip

    学习Hibernate3.3,需要关注性能优化技巧,例如延迟加载(Lazy Loading)、批处理(Batch Processing)、结果集缓存(Result Set Caching)、预加载(Preloading)等。理解并适时应用这些技术,可以在保证应用功能的...

    hibernate全套学习课件ppt

    3. **配置文件(hibernate.cfg.xml)**:这是Hibernate的主配置文件,包含了数据库连接信息、方言设置、缓存策略等关键配置。 4. **会话(Session)**:Session是Hibernate与数据库交互的主要接口,负责管理对象的...

    Hibernate中文参考文档学习

    在这个“Hibernate中文参考文档学习”中,我们可以深入理解Hibernate的核心概念、配置、实体映射、查询语言以及其他关键特性。 1. **核心概念** - **对象关系映射(ORM)**: ORM是将数据库中的数据模型转换为面向...

    Hibernate学习笔记!

    **Hibernate学习笔记** Hibernate是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。本笔记将深入探讨Hibernate的核心概念、配置、实体管理、查询语言以及最佳实践...

    hibernate学习学习

    在这个“hibernate学习学习”的主题中,我们将深入探讨Hibernate的核心概念、配置、实体映射、查询语言以及其在实际项目中的应用。 1. **Hibernate核心概念** - Session:这是Hibernate的主要工作接口,它负责管理...

    hibernate学习资源代码

    **hibernate学习资源代码** Hibernate 是一个强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者能够用Java对象的方式处理数据库交互。本学习资源包含了一系列针对初学者的实用示例,涵盖了...

    hibernate 3.3学习笔记

    **hibernate 3.3学习笔记** 在深入探讨Hibernate 3.3的学习笔记之前,首先需要理解Hibernate是什么。Hibernate是一个强大的开源Java持久化框架,它简化了数据库操作,允许开发者将精力集中在业务逻辑上而不是数据库...

Global site tag (gtag.js) - Google Analytics