package com.rlovep.one2many;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
//测试懒加载
public class AppLazy {
private static SessionFactory sf=null;
static{
Configuration config=new Configuration().configure().addClass(Dept.class).addClass(Employee.class);
//创建serviceRegistry 代替buildSessionFactory()方法
ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 创建session的工厂对象
sf = config.buildSessionFactory(serviceRegistry);
}
//测试懒加载对get的影响
@Test
public void test_get(){
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//get及时查询,不管使用dept与否都会执行查询语句与懒加载无关
Dept dept=(Dept)session.get(Dept.class, 1);
/*System.out.println(dept.getDname());
System.out.println("------");
System.out.println(dept.getEmps().isEmpty());//但是集合,set,list,map等是属于懒加载的,当不使用时getEmps是,此处输出true;
*/ tx.commit();
session.close();
//session关闭也可以获得数据
System.out.println(dept.getDname());
}
//测试懒加载对load的影响,
@Test
public void test_load(){
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
// load,默认懒加载, 及在使用数据的时候,才向数据库发送查询的sql语句!
Dept dept=(Dept)session.load(Dept.class, 1);
/*//解决懒加载报错办法:
//1.先使用一下数据
dept.getDname();
//2.强迫代理对象初始化
Hibernate.initialize(dept);*/
tx.commit();
session.close();
//如果关闭session使用dept,会报错。
System.out.println(dept.getDname());
}
}