在之前的基础上测试懒加载与普通加载的区别冬眠的懒加载
对象的三种状态对于Hibernate而言,对象的状态分为3种:
1)暂时态当对象刚创建,和会话没有发生任何关系时,当程序运行完就立刻消失,被称为暂时态。
2)持久态当执行如下代码时,对象变为持久态Emp e = new Emp();
session.save(); 持久态的对象和会话发生了关系,如执行了保存,获取,查询等方法
Session中会缓存该对象(Session的缓存即一级缓存)
会话再获取对象时,首先去查找一级缓存,如果没有才查询数据库
会议要负责将持久态对象的变化更新到数据库(在是flush()的时候更新,tx在提交的时候会自动调用session的flush())
3)游离态调用了session.evict(Object obj)方法,和Session解除了关系
冬眠懒加载
懒惰加载懒惰 ?
懒加载又称延迟加载,
原理:当访问实体对象是,并不是立即到数据库中查询而是在真正要使用实体对象时,才到数据库中的查询数据,尽可能晚的将数据库的数据加载到内存来,作用提高应用的运行性能。
延迟加载的应用:session.Load()query.iterate()以及关联查询,这些方法返回的对象,里面没有数据,数据在用的时候(调用get()方法时),才取好处:不得,不查询数据库
验证一级缓存的存在
s.evict(学生);
//从数据库中查询放到会话缓存中,s.evict清除缓存,清空,现在缓存没有
//再次查询是,缓存中没有,到数据库查询
//验证一级缓存的存在
@Test
public void testExist() {
Session s = openSession();
Student student = (Student) s.get(Student.class, 2);
System.out.println(student.toString());
System.out.println("----------------------------");
s.evict(student);
//从数据库中查询放到session缓存中,s.evict清除缓存,清空,现在缓存没有
//再次查询是,缓存中没有,到数据库查询
Student st1 = (Student) s.get(Student.class, 2);
System.out.println(st1.toString());
System.out.println("-----------------");
System.out.println(st1==student);
}
测试结果为假,第一次查询后,使用逐出()清空缓存,再次查询的时候缓存中不存在,重新再数据库中查询,这样的他们的物理存储空间就不相同了,则为假
在之前的基础上测试懒加载与普通加载的区别
//验证懒加载的原理(get 不进行懒加载。load进行懒加载
@Test
public void testLazy() {
Session s=openSession();
Student student = (Student) s.get(Student.class, 2);//进行查询
System.out.println("-------------------");
System.out.println(student.toString());
}
@Test
public void testLazy2() {
Session s=openSession();
Student student = (Student) s.load(Student.class, 2); //运行到这,不做查询
System.out.println("----------------------");
System.out.println(student.toString());
s.close();
}
这里需要注意分隔符的位置,因为在get()方法中,学生=(学生)s.get(Student.class,2); //进入数据库进行查询
而负载()的方法执行,的System.out.println(student.toString());这里才执行