Hibernate----学习(3)----Session && Session 缓存(一级缓存)

1. Session 概述

             •Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口,

                                      它提供了基本的保存, 更新, 删除和加载 Java 对象的方法.

             Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中

                                     的相关记录对应. Session 能够在某些时间点, 按照缓存中

                                     对象的变化来执行相关的 SQL 语句, 来同步更新数据库,

                                     这一过程被称为刷新缓存(flush)

            站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态

                                      游离状态, 删除状态. Session 的特定方法能使对象从一个

                                      状态转换到另一个状态.

 2. Session 缓存

            2.1 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存.

              只要 Session 实例没有结束生命周期, 且没有清理缓存,

               则存放在它缓存中的对象也不会结束生命周期

            2.2 Session 缓存可减少 Hibernate 应用程序访问数据库的频率。

3.操作Session缓存。

         3.1  flush 缓存

                   3.1.1 flushSession 按照缓存中对象的属性变化来同步更新数据库

                   3.1.2  默认情况下 Session 在以下时间点刷新缓存:

                              > 显式调用 Session flush() 方法

                              >  当应用程序调用 Transaction commit()方法的时, 该方法先 flush

                                        然后在向数据库提交事务

                              > 当应用程序执行一些查询(HQL, Criteria)操作时,如果缓存中持久化对象的

                                       属性已经发生了变化,会先 flush 缓存,以保证查询结果能够反映持久化对

                                       象的最新状态。

                  3.1.3 若记录的id是由底层数据库使用自增的方式生成的(如果对象使用 native 生成器生成 OID),

                        在调用save()方法后,就会立即发送insert语句,因为save()方法后,必须保证对象的id时存在的。

                 3.1.4    commit() flush() 方法的区别:

                                  flush 执行一系列 sql 语句,但不提交事务;

                                  commit 方法先调用flush() 方法,然后提交事务

                                 提交事务意味着对数据库操作永久保存下来。

   3.2 refresh()  会强制发送select语句,保证session中的对象与数据库中的数据保持一致。

@Test
public void testSessionRefresh() {
	News news = (News) session.get(News.class,5);
	System.out.println(news);
	session.refresh(news);
	System.out.println(news);
}

3.3  clear()会清除session缓存中的对象

@Test
public void testClear(){
	News news = (News) session.get(News.class,5);
	System.out.println(news);

	News news2 = (News) session.get(News.class,5);
	System.out.println(news2);

	session.clear();
	News news3 = (News) session.get(News.class,5);
	System.out.println(news3);
}

 从控制台可以看出,当清除了缓存以后,需要再次从数据库查询对象。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值