数据源:文件和数据库。从内存中获取,不用去数据库发送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. jq中append()、prepend()、after()、before()的区别详解

    1.append() - 在被选元素的结尾插入内容(内容的结尾,比如说有个a标签,则是在</a>这个标签之前添加东西) 2.prepend() - 在被选元素的开头插入内容(内容的开始,比 ...

  2. substr 方法

    substr 方法 返回一个从指定位置开始,并具有指定长度的子字符串. 参数 start 必选.所需的子字符串的起始位置.字符串中第一个字符的索引为 0. length 可选项.返回的子字符串中包含的 ...

  3. Nhibernate系列学习之(四) 数据操作

    数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT ...

  4. poj2263 zoj1952 Heavy Cargo(floyd||spfa)

    这道题数据范围小,方法比较多.我用floyd和spfa分别写了一下,spfa明显有时间优势. 一个小技巧在于:把城市名称对应到数字序号,处理是用数字. 方法一:spfa #include<ios ...

  5. Codeforces Round #276 (Div. 2)D - Maximum Value(筛法)

    就是一种筛法思想的应用. #include<iostream> #include<cstdio> #include<cstdlib> #include<cst ...

  6. LeetCode Longest Uncommon Subsequence II

    原题链接在这里:https://leetcode.com/problems/longest-uncommon-subsequence-ii/#/description 题目: Given a list ...

  7. 洛谷 P3048 [USACO12FEB]牛的IDCow IDs

    题目描述 Being a secret computer geek, Farmer John labels all of his cows with binary numbers. However, ...

  8. 下载安装tomcat至服务器

    1.安装JDK之后,下载Tomcat:http://tomcat.apache.org/download-70.cgi选择下载32-bit/64-bit Windows Service Install ...

  9. 查看.Net Framework版本号

    目录 摘要 .NET Framework 的版本 确定计算机上安装的 .NET Framework 版本 补充几个查看.Net Framework版本号 概要 本文描述如何确定计算机上安装的 Micr ...

  10. Nginx理解

    说到反向代理,可能很多人都听说,但具体什么是反向代理,很多人估计就不清楚了.摘一段百度百科上的描述: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后 ...