Hibernate4从入门到精通四——————延迟加载


一、   延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就

是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对

实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。


二、拷贝上个项目,在org.zttc.itat.test包下创建Junit测试类

TestLazy.java

package org.zttc.itat.test;

import java.util.Date;

import org.hibernate.Session;
import org.junit.Test;
import org.zttc.itat.dao.UserDao;
import org.zttc.itat.model.User;
import org.zttc.itat.util.HibernateUtil;

public class TestLazy {

	@Test
	public void testLazy01() {
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			User u=(User)session.load(User.class, 1);
			//此时一条sql都没发,这就是hibernate的延迟加载。
			/*
			 * 延迟加载:当完成load操作之后,不会马上发出sql语句,只有在使用到该对象时才发送sql语句,
			 *        当完成load之后,u其实是一个代理对象,这个代理对象中只有一个id值。
			 */
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally{
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void testLazy02() {
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			User u=(User)session.load(User.class, 1);
			//此时一条sql都没发,这就是hibernate的延迟加载。
			/*
			 * 延迟加载:当完成load操作之后,不会马上发出sql语句,只有在使用到该对象时才发送sql语句,
			 *        当完成load之后,u其实是一个代理对象,这个代理对象中只有一个值,为id。
			 */
			//此时不会发sql,因为u中有id
			System.out.println(u.getId());
			//下面的语句会发sql语句,因为代理对象u中没有nickname的值。
			System.out.println(u.getNickname());
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally{
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void testLazy03() {
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			//get是只要一执行就发sql语句,get没有延迟加载
			User u=(User)session.get(User.class, 1);
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally{
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void testLazy04() {
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			//get是只要一执行就发sql语句,get没有延迟加载
			User u=(User)session.get(User.class, 111);
			//此时,取了这个数据,发现数据库中没有,u是null,会抛出空指针异常。
			System.out.println(u.getId());
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally{
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void testLazy05() {
		Session session=null;
		try {
			session=HibernateUtil.openSession();
			User u=(User)session.load(User.class,111);
			//由于id存在u的代理对象中,所以不抛异常。
			System.out.println(u.getId());
			/*
			 * 下面语句会去数据库中取数据,发现没有这个对象,但u不为空。
			 * 所以会抛出ObjectNotFoundException
			 */
			System.out.println(u.getPassword());
		} catch (Exception e) {
			e.printStackTrace();
			if(session!=null) session.getTransaction().rollback();
		} finally{
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void testLazyQuestion(){
		UserDao ud =new UserDao();
		User u=new User();
		u.setBorn(new Date());
		u.setNickname("abc");
		u.setPassword("123");
		u.setUsername("333");
		ud.update(u);
	}
	
	@Test
	public void testLazyQuestion1(){
		UserDao ud =new UserDao();
		User u=ud.load(2);
		System.out.println(u.getUsername());
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值