一、 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就
是当在真正需要数据的时候,才真正执行数据加载操作。在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());
}
}