1:持久化对象的四种状态
四种状态分别为临时状态、持久化状态、游离状态和删除状态。
这几种状态可以相互转换
状态转换图:
2:一级缓存
也成为session缓存,它和session生命周期相同,周期比较短,属于事务隔离级别。
hibernate的缓存是通过集合实现的,hibernate中封装了list和map的集合。hibernate向一级缓存中存放数据时,同时保存快照数据,当执行flush()时,会对比一级缓存中的数据和快照中的数据是否一致,如果不一致,则执行更新。
用处:
当要查询的数据在缓存中已经存在时,hibernate将不会再向数据库发送查询语句,而是直接从缓存中获取对象。
session.get()、load(支持一级缓存。createQuery()不支持一级缓存,即即使是两次相同的查询,获得list也是相同的,也会向数据库发起2次查询
操作:
1:flush()
将缓存同步到数据库,首先会将缓存数据和快照区数据进行对比,如果相同,就不会发送update()语句,如果不同,则执行update()语句,所以不一定会很发生update()语句到数据库。
session.beginTransaction();
// 通过ID从数据库中获取值,此时会产生快照
Book book1 = (Book) session.get(Book.class, 1);
// 修改属性值
book1.setName("xxx");
// 手动flush,刷新缓存到数据库,此时只是生成SQL语句,但是数据库中并没有发生变化,只有commit后,数据库才会发生相应的变化。
session.flush();
// 手动提交事务
session.getTransaction().commit();
// 关闭session的资源
session.close();
2:refresh()
将数据库中的数据同步到缓存中,这个过程一定会产生更新语句,同步一级缓存和快照
// 从数据库中查询book,并放置到Session缓存中一份
Book book1 = (Book) session.get(Book.class, 1);
//修改缓存对象的值
book1.setName("xxx");
//又进行了一次查询操作,此时把快照中的数据与数据库一致
session.refresh(book1);
System.out.println(book1);
// 4.提交事物
session.getTransaction().commit();
// 5.关闭session资源
session.close();
3:clear()
清除所有对象的一级缓存,对对象的所有操作,全部失效,回复到当初和快照一样
//清除一级缓存操作,此时当作事务提交的时候,数据库中并没有发生任何的变化
session.clear();
4:evict()
对指定的对象清除一级缓存
session.beginTransaction();
//当执行一次操作后,会把对象放置到Session缓存中
Book book1 = (Book) session.get(Book.class, 1);
Book book2 = (Book) session.get(Book.class, 2);
session.evict(book2); // 从缓存中清除book2对象所做的修改
// 当再次执行操作时,book2还会发出SQL语句操作
Book book11 = (Book) session.get(Book.class, 1);
Book book22 = (Book) session.get(Book.class, 2);
// 手动提交事务
session.getTransaction().commit();
// 关闭资源
session.close();
持久化对象的四种对象以及一级缓存
猜你喜欢
转载自blog.csdn.net/zhang_sheng_nian/article/details/82421861
今日推荐
周排行