hibernate的懒加载

xiaoxiao2025-11-04  6

在之前的基础上测试懒加载与普通加载的区别冬眠的懒加载

对象的三种状态对于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());这里才执行

 

转载请注明原文地址: https://www.6miu.com/read-5039030.html

最新回复(0)