数据源:文件和数据库。从内存中获取,不用去数据库发送SQL语句查询了。缓存技术是hibernate的一个优化的手段。Session结束了,一级缓存就没了,就销毁了。SeesionFactory没了,二级缓存就没了,就销毁了。通常它是可以在多个session中共享数据的。一级缓存是自带的,不可卸载的。默认二级缓存是不开启,二级缓存不是自带的,可以卸载的,要使用它还要经过一系列的配置才可以使用。默认开启的是一级缓存。


这些Java集合构成了一级缓存。一级缓存是Session中那一系列的集合,而且Session没结束,一级缓存就存在。Session结束了,一级缓存就没有了。session.save()往一级缓存放一份数据,get()和load()方法不会再去发SQL查询数据库。


package cn.itcast.hibernate3.demo1;

import static org.junit.Assert.*;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import cn.itcast.utils.HibernateUtils; /**
* Hibernate的测试类
*
* @author zhongzh
*
*/ public class HIbernateTest1 {
@Test
//证明一级缓存的存在
public void demo3(){
//1.创建Session
Session session = HibernateUtils.openSession();
//2.开启事务
Transaction tx = session.beginTransaction(); //save方法可以向一级缓存中存放数据的.
/* Book book = new Book();
book.setName("JQuery开发");
book.setAuthor("张XX");
book.setPrice(45d); Integer id = (Integer)session.save(book);
Book book2 = (Book)session.get(Book.class,id);//get一执行,马上会发一条SQL语句去执行
//但是现在不会了,因为它可以从一级缓存中获取数据
*/ //分别用get执行两次查询.如果使用JDBC的话,执行两次查询它就发两次SQL语句
Book book1 = (Book)session.get(Book.class,1);//马上发SQL去查询 get()它可以使用一级缓存的数据 而你在第一次使用get()的时候它可以向一级缓存存放数据
System.out.println(book1);
Book book2 = (Book)session.get(Book.class,1);//不发SQL,因为使用一级缓存的数据
System.out.println(book2);
System.out.println(book2);
//3.提交事务
tx.commit();
//4.关闭资源
session.close(); }
@Test
//测试持久态的对象自动更新数据库(因为它依赖了hibernate的一级缓存区域)
public void demo2() {
//1.创建Session
Session session = HibernateUtils.openSession();
//2.开启事务
Transaction tx = session.beginTransaction(); //获得一个持久态的对象
Book book = (Book) session.get(Book.class, 1);
book.setName("Struts2开发3");//现在不用update(book)也可以自动完成数据库的更新
//没有手动调用update()方法也可以完成数据库的更新 //session.update(book);//之前是update(book)才能完成修改 //3.提交事务
tx.commit();
//4.关闭资源
session.close();
}
@Test
//区分持久化对象的三种状态:
public void demo1() {
// 1.创建Session
Session session = HibernateUtils.openSession();
// 2.开启事务
Transaction tx = session.beginTransaction(); //往数据库去保存一本图书:
Book book = new Book();//book是一个持久化对象,因为book有一个实体类已经
//和我们的表建立起映射了 Book是一个持久化类 一new()就是瞬时态了
//瞬时态: 没有唯一标识OID,没有与session关联.
//刚new()出来,从数据库里面也不知道它是什么。它根本就没有OID,没有和session关联,是一个单独的
//对象
book.setName("Hibernate开发");
book.setAuthor("孙XX");
book.setPrice(65d); session.save(book); //持久态 往数据库一存它就有OID了,而且是和session关联。
//持久态: 有唯一标识OID,与session关联. // 3.事务提交
tx.commit();
//4.释放资源
session.close(); book.setName("Struts2开发"); //脱管态 session关闭了,book不与session关联了。
//脱管态:有唯一的标识,没有与session关联.
fail("Not yet implemented");
} }
//******自动更新数据库的能力依赖了Hibernate的一级缓存.

day35-hibernate映射 04-Hibernate的一级缓存:一级缓存的存在的更多相关文章

  1. Hibernate 系列 04 - Hibernate 配置相关的类

    引导目录: Hibernate 系列教程 目录 前言: 通过上一篇的增删改查小练习之后,咱们大概已经掌握了Hibernate的基本用法. 我们发现,在调用Hibernate API的过程中,虽然Hib ...

  2. hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系

    hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持 ...

  3. 一级缓存二级缓存(hibernate)

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

  4. [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. Hibernate 再接触 一级缓存 二级缓存 查询缓存

    缓存 就是把本来应该放在硬盘里的东西放在内存里  将来存内存里读 一级缓存: session缓存 二级缓存: sessionFactory级别的   (适合经常访问,数据量有限,改动不大) 很多的se ...

  6. Hibernate——(5)持久化对象和一级缓存机制

    一.对象的三种状态 1.暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就即刻消失,被称为暂时态. 2.持久态:当执行如下代码时,对象变为持久态 Emp e = new Emp( ...

  7. hibernate的获取session的两方法比较,和通过id获取对象的比较,一级缓存二级缓存

    opensession与currentsession的联系与区别 在同一个线程中opensession的session是不一样的,而currentsession获取的session是一样的,这就保证了 ...

  8. hibernate学习(9)——日志,一对一,二级缓存

    1.Hibernate中的日志 1  slf4j 核心jar  : slf4j-api-1.6.1.jar .slf4j是日志框架,将其他优秀的日志第三方进行整合. 整合导入jar包 log4j 核心 ...

  9. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  10. 【Hibernate】解析hibernate中的缓存

    Hibernate中的缓存一共有三种,一级缓存.二级缓存.查询缓存.缓存除了使用Hibernate自带的缓存,还可以使用redis进行缓存,或是MongoDB进行缓存. 所使用的Demo: User. ...

随机推荐

  1. WP追加字符串到文件

    #if DEBUG const string logfile = "demo.log"; try { using (var sw = new System.IO.StreamWri ...

  2. map和reduce 个数的设定 (Hive优化)经典

    一.    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...

  3. Django 登录页面重定向

    转自:http://blog.chedushi.com/archives/3484 登陆和注销操作在网页编程上很常见,这两个操作经常需要在操作成功以后转入发出请求的页面. 比如用户正在浏览一篇文章,发 ...

  4. QQ帐户的申请与登陆(25 分)

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤),随后给出N行指令.每行指令的格式为:“命令符(空格)QQ号码( ...

  5. J2EE分布式服务基础之RPC

    一.RPC介绍 什么是RPC 远程过程调用(RPC)是一个协议,程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需知道网络细节. RPC模型 C/S模式 基于传输层协议 (例如 TCP/I ...

  6. 关于本地模块安装入maven仓库出现的异常

    Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.9.RELEASE:repackage (de ...

  7. Kubernetes创建挂载共享存储的容器

    原文链接:https://www.58jb.com/html/135.html 在上一次的Mysql容器中,已经使用过了配置宿主机目录挂载的方式,这样虽然方便但是不够安全:一般都是把数据存储在远程服务 ...

  8. POJ2536(二分图最大匹配)

    Gopher II Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8504   Accepted: 3515 Descrip ...

  9. springboot springcloud eureka

    参考: https://www.cnblogs.com/skyblog/p/5133752.htmlhttp://blog.csdn.net/u012734441/article/details/78 ...

  10. Day3(1)linux文件系统及文件类型

    Linux的文件系统 根文件系统(rootfs) root filesystem LSB,FHS:(FileSystem Heirache Standard) /etc,/usr,/var,/root ...