一、对象的三种状态

1、暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就即刻消失,被称为暂时态。
2、持久态:当执行如下代码时,对象变为持久态
Emp e = new Emp();
session.save();
持久态的对象和Session发生了关系,如执行了save,get,query等方法
Session中会缓存该对象(Session的缓存叫一级缓存)
Session再获取对象时,首先去查找一级缓存,如果没有才查询数据库
Session要负责将持久态对象的变化更新到数据库。
是在flush()的时候更新,tx在提交的时候会自动调用session的flush()
3、游离态:调用了session.evict(Object obj)方法,和Session解除了关系

二、一级缓存机制

一级缓存机制
其一,如果 session 被查询,session 将先到缓存中查找是否有被查询的对象,找到则直接取出,否则才查询数据库;
其二,session 需要负责实时维护在缓存中的数据,保证缓存中的数据与数据库中数据的一致性,一旦用户对缓存中数据做了修改,session立刻将数据更新到数据库中。

三、案例:对象的3中状态

1、使用前面使用的项目(请参考Hibernate系列的前几篇)
2、修改数据库表
DROP TABLE IF EXISTS t_foo;
CREATE TABLE t_foo (
t_id int(11) NOT NULL AUTO_INCREMENT,
t_value varchar(50) NOT NULL,
PRIMARY KEY (t_id)
) ENGINE=InnoDB;
3、Foo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xsyu.tts.po">
<class name="Foo" table="t_foo">
<id name="id" type="java.lang.Integer" column="t_id">
<!-- 用来指明主键的生成方式 -->
<generator class="identity"></generator>
</id>
<property name="value" type="java.lang.String" column="t_value" />
</class>
</hibernate-mapping>
4、HibernateUtil
package com.xsyu.tts.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtils {
private static ThreadLocal<Session> tl = new ThreadLocal<Session>();
private static Configuration conf;
private static SessionFactory factory;
static {
conf = new Configuration();
conf.configure();
factory = conf.buildSessionFactory();
} /**
*
* @return
*/
public static Session getSession() {
// factory.getCurrentSession();
Session session = tl.get();
if (session == null) {
session = factory.openSession();
tl.set(session);
}
return session;
} public static void closeSession() {
Session session = tl.get();
if (session != null) {
session.close();
tl.set(null);
}
}
}
5、TestPeresistence
a、测试:当foo为持久态时,修改value为foo200
public class TestPersistence {
@Test
public void testPersistence1() {
Foo foo = new Foo();
foo.setValue("foo100"); // 1. 现在的foo是暂时态
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
session.save(foo);
// 2. 现在的foo是持久态
// 测试:当foo为持久态时,修改value为foo200
foo.setValue("foo200");
tx.commit();
session.close();
}
}
如上所示,当执行了 session.save(foo)语句,对象变为持久态,当执行了 foo.setValue("foo200");语句后,session 自劢把该对象更新到数据库中。
b、数据库结果
c、控制台显示
session.save(foo);语句执行后,Hibernate 自动执行了 insert 操作,foo.setValue("foo200");语句执行后,Hibernate 又自动执行了 update 操作。
当事务提交时,session会把持久对象的改变更新到数据。
d、再修改一下
e、控制台
查看控制台,先执行了一次 session.flash(),之后 tx.commit()操作又自动执行了一次 session.flash(),所以,执行了2次update操作。
6、TestPersistence
a、新建testPersistence()方法
如上,凡是被session处理过的对象,都是持久态,
id=1的Foo对象在之前已经被持久化到了数据库中,
所以,通过get方法查询出的foo1和foo2对象时同一个对象。
如果session查询,foo1指向对象是持久态的,该对象将缓存于session中
Foo foo1 = (Foo)session.get(Foo.class, 1);
当session再一次查询
Foo foo2 = (Foo)session.get(Foo.class, 1);
session会首先在一级缓存中查询id=1的foo对象,
如果找到了,就直接从一级缓存中取,如果找不到,才查询数据库。
此时,如果执行
控制台打印
数据库会更改
当数据被缓存到session中,session就要负责维护缓存中的数据,这是Hibernate中的一个重要机制:一级缓存。
一级缓存机制
其一,如果 session 被查询,session 将先到缓存中查找是否有被查询的对象,找到则直接取出,否则才查询数据库;
其二,session 需要负责实时维护在缓存中的数据,保证缓存中的数据不数据库中数据的一致性,一旦用户对缓存中的数据做了修改,session 立刻将数据更新到数据库中。
b、加入session.evict()方法
当对象被清除出session后,即刻变为游离态,此时代码26-27中对象的修改将不起作用,session不会把游离态的对象更新到数据库中。
c、控制台不再打印update,数据库没有更新

Hibernate——(5)持久化对象和一级缓存机制的更多相关文章

  1. Hibernate 持久化对象和一级缓存

    关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识 ...

  2. Hibernate的持久化对象

     Hibernate的持久化类 什么是持久化类        1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类.        * ...

  3. Hibernate学习(二)———— 一级缓存和三种状态解析

    一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过session来对要操作的对象取得关联,然后在进行操作,那么具体的过程是什么样的呢? 1.首先sessi ...

  4. 【Hibernate】持久化对象状态及以及缓存

    一.持久化类状态 1.1 三种持久化对象的状态 1.2 区分三种状态 1.3 三种状态对象转换 1.瞬时态 2.持久态 3.脱管态 4.持久态对象有自动更新数据库的能力 一.持久化类状态 1.1 三种 ...

  5. Hibernate中的HQL查询与缓存机制

    HQL:完全面向对象查询 SQL的执行顺序: 1.From 2.Where 过滤基础数据 where与having的区别:1.顺序不同 2.where过滤基础数据 3. 过滤聚合函数 3.Group ...

  6. Hibernate第二天——实体类 与缓存机制

    第二天,我们先来了解一下框架里的一个重要概念:实体类 实体类:把数据表或其它持久化数据的格式映射成的类,就是实体类. 实体类的编写规则:由于对应的是javabean,因而也遵循javabean的一些规 ...

  7. Hibernate -- 操作持久化对象

    知识点2: session概述 Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口,它提供了基本的保存,更新, 删除和加载Java对象的方法. 知识点3:理解ses ...

  8. hibernate载入持久化对象的两种方式——get、load

    一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...

  9. Hibernate-实体-对象状态-一级缓存-事务-查询

    一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造         --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...

随机推荐

  1. centos php 安装memcached 扩展 支持sasl

    1.安装sasl yum install cyrus-sasl-lib.x86_64 yum install cyrus-sasl-devel.x86_64 2.下载libmemcached wget ...

  2. (素材源代码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI

    猫猫分享,必须精品 先看效果 代码学习地址: 猫猫学IOS(五)UI之360等下载管理器九宫格UI 猫猫学IOS(五)UI之360等下载管理器九宫格UI http://blog.csdn.net/u0 ...

  3. Xvisor ARM32 启动分析

    Linux内核历史悠久,特性丰富,但是代码量庞大,各个子系统交叉繁琐.对于想要将操作系统内核各个特性研究一遍的人,有时候也只好"望Linux兴叹".Xvisor是一个较新的Type ...

  4. Android利用AlarmManager执行定时任务

    Android中的AlarmManager功能很强大,它是一个全局定时器,可以在指定时间或者指定周期启动其他组件(包括Activity.Service.BroadcastReceiver). 使用Al ...

  5. 15、NAND FLASH驱动程序框架

    驱动可以参考At91_nand.c,这个比S3c2410.c (drivers\mtd\nand)简单多了 NAND FLASH是一个存储芯片那么: 这样的操作很合理"读地址A的数据,把数据 ...

  6. Your algorithm's runtime complexity must be in the order of O(log n).

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  7. JNI——Java调用C/C++函数

    从C/C++到Java,再从Java回到C/C++,今天终于有机会了解了连接Java.C/C++的桥梁——JNI.哈哈!分享一下!   一.简介 JNI是Java native interface的简 ...

  8. php二维数组中的查找(善于利用基础函数)

    php二维数组中的查找(善于利用基础函数) 一.总结 真没必要完整的写函数,善于借用 1.array_search()是在以为数组中来找,现在我们要在二维数组数组中来,肯定要借用这个 2.!==fal ...

  9. matplotlib学习之颜色样式

    一.颜色 1.内建八种默认颜色 蓝色 - 'b' 绿色 - 'g' 红色 - 'r' 青色 - 'c' 品红 - 'm' 黄色 - 'y' 黑色 - 'k' 白色 - 'w' 2.灰度 plt.plo ...

  10. Angular 2 HostListener & HostBinding

    原文 https://www.jianshu.com/p/20c2d60802f7 大纲 1.宿主元素(Host Element) 2.HostListener 3.HostListenerDecor ...