Hibernate学习—— 一级缓存&快照

版权声明: https://blog.csdn.net/hu18315778112/article/details/84766024

上一篇说到,Hibernate框架中,对象转化为持久化状态后,会在事务提交时,自动将对象属性存储到数据库,而在事务提交之前,我们是对哪里的对象进行操作呢,这就是一级缓存(Session缓存)的作用。

  • 我们在将对象转化为持久化状态时,就是将这个对象保存到了一级缓存中,在这之后和事务提交之前,我们对对象进行的所有操作都会同步到session缓存中,在事务提交时,Hibernate会将这个对象的信息根据配置文件对应关系(属性名对应列名)保存到数据库中。

快照:快照可以说是与缓存对应的关系

通过前面学习知道:当通过new创建一个对象c,并将其与session关联后,c就保存到了缓存中,此时在事务提交时将其保存到数据库中,但是在另一种情况下:

如:

Customer c1=session.get(Customer.class, 1l);// 假设c1原本的name为  胡胡
c1.setCust_name("胡一");
c1.setCust_name("胡二");
c1.setCust_name("胡胡");

tst.commit();  // 事务提交

以上这种情况,通过测试可以知道,获得c1后,事务提交时,框架并没有帮我们执行任何数据库操作,这就是快照的作用。

  • 当通过直接get的方式获得对象时,此时对象直接就是持久化状态,Hibernate会将对象的原始数据拷贝两份存储,一份放在session缓存中,另一份放在快照中,当用户操作完毕后,操作的是缓存中的数据,Hibernate将操作后缓存中的数据与快照中的原始数据进行比较,如果比较发现两份数据不相同,则将缓存中的数据存储到数据库中,如果发现相同,Hibernate则不会进行任何数据库操作。这就是快照的作用。

 当新new出来的对象与session关联时,快照中是不存储这个对象的任何信息的,所以当事务提交时,缓存与快照比较当然会不同,所以讲新数据存储到数据库。

猜你喜欢

转载自blog.csdn.net/hu18315778112/article/details/84766024
今日推荐