Hibernate三种状态的区别,持久化状态与一级缓存,懒加载,急加载

Hibernate的三种状态

1、瞬时状态 : 由 new 操作符创建,且尚未与Hibernate Session 关联的对象是瞬时的` ,如果没有被使用,还会被gc回收:

   //瞬时状态
            RoleEntity r=new RoleEntity();
            r.setRoleName("教师");`

2、持久状态 ---->内存中存在,数据库中也存在,在相关联的Session的作用范围内,是持久状态的,在修改持久状态的时候,不会去立即同步数据库,会先放入到一级缓存,当我们提交事务的时候, hibernate会自动执行update,把缓存与数据库同步

   Transaction tr= session.getTransaction();

        tr.begin();
            /***持久状态**/
            session.save(r);
            //操作持久状态
            r.setRoleName("学生");

        tr.commit();
            /***持久状态**/
        session.close();

3、游离状态------>在内存中存在,在数据库中不一定存在,在相关联的Session的关闭后,当与新的Session的关联后,又会变成的持久状态

Hibernate的缓存

1、默认支持一级缓存,一级缓存是session级别,可以减少访问数据库的次数
2、可插拨式的缓存,二级缓存,二级缓存是sessionFactory 级别的缓存

    @Test
    public  void load(){
        RoleEntity roleEntity= session.load(RoleEntity.class,"4028808e70e654ea0170e654f12b0000");
        //因为使用的是loa方法其实是将roleEntity放在一级缓存Session当中,并未执行sql语句,而当在调用对象属性的时候才执行sql语句,去查询数据库
         System.out.println("session关闭之前"+roleEntity.getRoleName());
        //一级缓存
        session.close();
        //一级缓存关闭,roleEntity.getRoleName是在内存中提取到
        System.out.println("session关闭之后"+roleEntity.getRoleName());
    }
 @Test
    public  void load(){
        RoleEntity roleEntity= session.load(RoleEntity.class,"4028808e70e654ea0170e654f12b0000");
         //System.out.println("session关闭之前"+roleEntity.getRoleName());
        //一级缓存
        session.close();
        //一级缓存关闭,此时执行则会抛出noSession的错误,不再与数据库有连接
        System.out.println("session关闭之后"+roleEntity.getRoleName());
    }

懒加载,急加载

1.什么是懒加载,什么是急记载,如何使用?
懒加载就是延迟加载,急记载就是立即加载
load方法支持懒加载,,get方法支持急加载

2.懒加载和急加载的区别?
懒加载就是load方法,对象先放在一级缓存当中,当要调用对象属性的时候,才会去连接数据库进行操作,然后将查出来的数据存放到一级缓存中,但Session关闭时,当Session关闭时,继续操作对象属性就会抛出noSession的错误,因为不再与数据库有连接

急记载就是get方法,马上查询数据库,然后将查出来的数据存放当一级缓存中,即使Session关闭,依然可以获得数据,因为数据存放到内存当中

发布了5 篇原创文章 · 获赞 3 · 访问量 74

猜你喜欢

转载自blog.csdn.net/weixin_45989618/article/details/104924026