Java三大框架之——Hibernate中的三种数据持久状态和缓存机制,

1. Hibernate入门(五)hibernate的级联(cascade)表操作

https://blog.csdn.net/qq_28483283/article/details/51348558

2.关于Hibernate级联操作的总结

https://www.cnblogs.com/Vincent-NMT/p/6870333.html

3.Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

https://www.cnblogs.com/hcl22/p/6100191.html

Hibernate中的三种状态

    瞬时状态:刚创建的对象还没有被Session持久化、缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID。   

  持久状态:对象经过Session持久化操作,缓存中存在这个对象的数据为持久状态并且数据库中存在这个对象对应的数据为持久状态这个时候有OID

  游离状态:当Session关闭,缓存中不存在这个对象数据而数据库中有这个对象的数据并且有OID为游离状态。

  注:OID为了在系统中能够找到所需对象,我们需要为每一个对象分配一个唯一的表示号。在关系数据库中我们称之为关键字,而在对象术语中,则叫做对象标识

(Object identifier-OID).通常OID在内部都使用一个或多个大整数表示,而在应用程序中则提供一个完整的类为其他类提供获取、操作。

  Hibernate数据状态图:

    

需要注意的是:

      当对象的临时状态将变为持久化状态。当对象在持久化状态时,它一直位于 Session 的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用 save() 或 update() 方法是没有意义的。  

复制代码

Student stu = new Strudnet();

stu.setCarId(“200234567”);

stu.setId(“100”);

// 打开 Session, 开启事务

//将stu对象持久化操作
session.save(stu);

stu.setCardId(“20076548”);

//再次对stu对象进行持久化操作
session.save(stu); // 无效

session.update(stu); // 无效

// 提交事务,关闭 Session

复制代码

Hibernate缓存机制

什么是缓存?

  缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。  

缓存有什么好处?

  缓存的好处是降低了数据库的访问次数,提高应用性能,减少了读写数据的时间

什么时候适合用缓存?

  程序中经常用到一些不变的数据内容,从数据库查出来以后不会去经常修改它而又经常要用到的就可以考虑做一个缓存,以后读取就从缓存来读取,而不必每次都去查询数据库。因为硬盘的速度比内存的速度慢的多。从而提高了程序的性能,缓存的出现就会为了解决这个问题

Hibernate中的缓存

  Hibernate中的缓存包括一级缓存(Session缓存)二级缓存(SessionFactory缓存)查询缓存

    

    一级缓存(Session缓存)

    由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。Session级缓存是必需的,不允许而且事实上也无法卸除。在Session级缓存中,持久化类的每个实例都具有唯一的OID。

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。

    当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

    Session为应用程序提供了两个管理缓存的方法:evict(Object obj):从缓存中清除参数指定的持久化对象。clear():清空缓存中所有持久化对象。

复制代码

    public static void testOneLeveCache(){
        Session session=HibernateUtil.getSession();
        //获取持久化对象Dept
        Dept d1=(Dept)session.get(Dept.class, 10);
        //再次获取持久化对象Dept
        Dept d2=(Dept)session.get(Dept.class, 10);    
        session.close();
    }

复制代码

猜你喜欢

转载自blog.csdn.net/ziyouniao719672119/article/details/81361433
今日推荐