1.前言
在hibernate中有三级缓存,本篇博客先详细的介绍一下,Hibernate中的一级缓存,也就是Session级别的缓存。
2.持久化对象
如果要说到Hibernate的缓存的话,那么首先咱得提一下hibernate中的持久化对象。
其中持久化对象有三种状态,分别是:
transient(瞬时态):尚未与Session关联对象,失去引用的话,就会被JVM回收。一般就是直接New创建的对象。
persistent(持久态):已经与当前session产生关联,并且相关联的session没有关闭,并且事务尚未提交。
detached(脱管态):存在持久化OID,但没有与当前session关联,脱管状态改变hibernate不能检测到。
- <span style="font-family:SimSun;font-size:18px;">
- Session session = HibernateUtils.openSession();
-
- Transaction transaction = session.beginTransaction();
-
- Book book = new Book();
- book.setName("hibernate精通");
- book.setPrice(56d);
-
- session.save(book);
-
-
- transaction.commit();
- session.close();
-
- System.out.println(book.getId());
- </span>
3.持久化对象之间转变
1.瞬态对象——通过new关键字获取
瞬时——持久:save、saveOrUpdate(都是通过session获得)
瞬时——脱管:对象.setID(1);为瞬时对象设置新的OID
2.持久化对象——通过get/load、Query查询获得
持久——瞬时:delete(被删除持久化对象,不建议再次使用)
持久——脱管:evict(清楚一级缓存中某个对象)、close(关闭Session,清除一级缓存)、clear(清楚一级缓存所有对象)
3.脱管对象:无法直接获得
脱管——瞬时:对象.setID(null);删除对象OID
脱管——持久:update、saveOrUpdate、lock
4.Session中的一级缓存
终于到本篇博客的重点了,其中Session的缓存是通过集合来实现的,在hibernate中封装了list和map的各种集合,用来为Session服务。
分析:hibernate向一级缓存放入数据时,同时保存快照数据,当修改一级缓存的时候,在flush操作时,对比缓存和快照,如果不一致,自动更新。
常见的操作
1.flush
修改一级缓存数据,针对内存操作,需要在session执行flush操作时,将缓存变化同步在数据库,而只有在缓存数据与快照区不一致的时候,才会生成update语句。
- <span style="font-family:SimSun;font-size:18px;">@Test
- public void fun7() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
-
-
-
- Book book1 = (Book) session.get(Book.class, 1);
-
- book1.setName("struts璇﹁В");
-
- session.flush();
-
- session.getTransaction().commit();
-
- session.close();
- }</span>
2.clear
清楚所有对象的一级缓存,对对象所做的修改,全部都没有了,跟当初的快照一样。
- <span style="font-family:SimSun;font-size:18px;">public void fun7() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
-
-
-
- Book book1 = (Book) session.get(Book.class, 1);
-
- book1.setName("struts璇﹁В");
-
- session.clear();
-
- session.getTransaction().commit();
-
- session.close();
- }
- </span>
3.evict
清除一级缓存指定对象
- <span style="font-family:SimSun;font-size:18px;">@Test
- public void fun5() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
-
- Book book1 = (Book) session.get(Book.class, 1);
- Book book2 = (Book) session.get(Book.class, 2);
-
-
-
- session.evict(book2);
-
- Book book11 = (Book) session.get(Book.class, 1);
- Book book22 = (Book) session.get(Book.class, 2);
-
-
- session.getTransaction().commit();
-
- session.close();
- }
- </span>
4.refresh
重新查询数据库,更新快照和一级缓存
- <span style="font-family:SimSun;font-size:18px;">@Test
- public void fun6() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
-
-
- Book book1 = (Book) session.get(Book.class, 1);
-
- book1.setName("spring璇﹁В");
-
-
- session.refresh(book1);
-
- System.out.println(book1);
-
-
- session.getTransaction().commit();
-
- session.close();
- }</span>
5.Session手动控制缓存
在hibernate中也为 我们提供了手动控制缓存的机制,具体如下
Always:每次查询时,session都会flush
Auto:有些查询时,session会默认flush,例如commit。session.flush
Commit:在事务提交的时候
Manual:只有手动调用sessionflush才会刷出
- <span style="font-family:SimSun;font-size:18px;">public void fun7() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
- session.setFlushMode(FlushMode.MANUAL);
-
-
- Book book1 = (Book) session.get(Book.class, 1);
-
- book1.setName("struts璇﹁В");
-
- session.flush();
-
- session.getTransaction().commit();
-
- session.close();
- }
- </span>
1.前言
在hibernate中有三级缓存,本篇博客先详细的介绍一下,Hibernate中的一级缓存,也就是Session级别的缓存。
2.持久化对象
如果要说到Hibernate的缓存的话,那么首先咱得提一下hibernate中的持久化对象。
其中持久化对象有三种状态,分别是:
transient(瞬时态):尚未与Session关联对象,失去引用的话,就会被JVM回收。一般就是直接New创建的对象。
persistent(持久态):已经与当前session产生关联,并且相关联的session没有关闭,并且事务尚未提交。
detached(脱管态):存在持久化OID,但没有与当前session关联,脱管状态改变hibernate不能检测到。
- <span style="font-family:SimSun;font-size:18px;">
- Session session = HibernateUtils.openSession();
-
- Transaction transaction = session.beginTransaction();
-
- Book book = new Book();
- book.setName("hibernate精通");
- book.setPrice(56d);
-
- session.save(book);
-
-
- transaction.commit();
- session.close();
-
- System.out.println(book.getId());
- </span>
3.持久化对象之间转变
1.瞬态对象——通过new关键字获取
瞬时——持久:save、saveOrUpdate(都是通过session获得)
瞬时——脱管:对象.setID(1);为瞬时对象设置新的OID
2.持久化对象——通过get/load、Query查询获得
持久——瞬时:delete(被删除持久化对象,不建议再次使用)
持久——脱管:evict(清楚一级缓存中某个对象)、close(关闭Session,清除一级缓存)、clear(清楚一级缓存所有对象)
3.脱管对象:无法直接获得
脱管——瞬时:对象.setID(null);删除对象OID
脱管——持久:update、saveOrUpdate、lock
4.Session中的一级缓存
终于到本篇博客的重点了,其中Session的缓存是通过集合来实现的,在hibernate中封装了list和map的各种集合,用来为Session服务。
分析:hibernate向一级缓存放入数据时,同时保存快照数据,当修改一级缓存的时候,在flush操作时,对比缓存和快照,如果不一致,自动更新。
常见的操作
1.flush
修改一级缓存数据,针对内存操作,需要在session执行flush操作时,将缓存变化同步在数据库,而只有在缓存数据与快照区不一致的时候,才会生成update语句。
- <span style="font-family:SimSun;font-size:18px;">@Test
- public void fun7() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
-
-
-
- Book book1 = (Book) session.get(Book.class, 1);
-
- book1.setName("struts璇﹁В");
-
- session.flush();
-
- session.getTransaction().commit();
-
- session.close();
- }</span>
2.clear
清楚所有对象的一级缓存,对对象所做的修改,全部都没有了,跟当初的快照一样。
- <span style="font-family:SimSun;font-size:18px;">public void fun7() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
-
-
-
- Book book1 = (Book) session.get(Book.class, 1);
-
- book1.setName("struts璇﹁В");
-
- session.clear();
-
- session.getTransaction().commit();
-
- session.close();
- }
- </span>
3.evict
清除一级缓存指定对象
- <span style="font-family:SimSun;font-size:18px;">@Test
- public void fun5() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
-
- Book book1 = (Book) session.get(Book.class, 1);
- Book book2 = (Book) session.get(Book.class, 2);
-
-
-
- session.evict(book2);
-
- Book book11 = (Book) session.get(Book.class, 1);
- Book book22 = (Book) session.get(Book.class, 2);
-
-
- session.getTransaction().commit();
-
- session.close();
- }
- </span>
4.refresh
重新查询数据库,更新快照和一级缓存
- <span style="font-family:SimSun;font-size:18px;">@Test
- public void fun6() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
-
-
- Book book1 = (Book) session.get(Book.class, 1);
-
- book1.setName("spring璇﹁В");
-
-
- session.refresh(book1);
-
- System.out.println(book1);
-
-
- session.getTransaction().commit();
-
- session.close();
- }</span>
5.Session手动控制缓存
在hibernate中也为 我们提供了手动控制缓存的机制,具体如下
Always:每次查询时,session都会flush
Auto:有些查询时,session会默认flush,例如commit。session.flush
Commit:在事务提交的时候
Manual:只有手动调用sessionflush才会刷出
- <span style="font-family:SimSun;font-size:18px;">public void fun7() {
-
- Session session = HibernateUtils.getSession();
-
- session.beginTransaction();
-
- session.setFlushMode(FlushMode.MANUAL);
-
-
- Book book1 = (Book) session.get(Book.class, 1);
-
- book1.setName("struts璇﹁В");
-
- session.flush();
-
- session.getTransaction().commit();
-
- session.close();
- }
- </span>