时间:2017-1-19 23:00

——Hibernate持久化类的状态

1、持久化类:就是一个实体类与数据库建立了映射。

2、Hibernate为了方便管理持久化类,将持久化类分为了三种状态:
    1)瞬时态:transient(临时态)
    2)持久态:persistent
    3)脱管态:detached(离线态)

——三种持久化对象的状态

1、三种持久化对象的状态
    1)瞬时态
        不存在持久化标识OID,尚未与Hibernate Session关联对象,被认为处于瞬时状态,失去引用将被JVM回收。
        无持久化标识OID,未与Session关联。

    2)持久态
        存在持久化标识OID,与当前Session有关联,并且关联的Session没有关闭,事务未提交。
        存在持久化标识OID,与Session关联。

        持久化对象有自动更新数据库的能力。

    3)脱管态
        存在持久化OID,但没有与当前Session关联,脱管状态改变时Hibernate无法检测。
        存在持久化标识OID,未与Session关联。

2、区分三种持久化对象的状态

示例代码:

public class HibernateDemo1 {
    @Test
    /*
     * 区分持久化对象的三种状态:
     */
    public void fun1(){
        // 1、创建Session
        Session session = HibernateUtils.openSession();
        // 2、开启事务
        Transaction tx = session.beginTransaction();
 
        /*
         * 3、逻辑操作
         */
 
        // 向数据库中保存一本图书
        Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与Session关联
 
        book.setName("Hibernate");
        book.setAuthor("张三");
        book.setPrice(50D);
 
        session.save(book); // book变为一个持久态对象,有唯一标识OID,与Session关联
 
 
        // 4、提交事务
        tx.commit();
        // 5、施放资源
        session.close();
 
        book.setName("Struts2"); // 此时book就是脱管态了,有唯一标识OID,但与Session无关联
    }
}

3、三种状态对象的转换

瞬时态:
    Book book = new Book();
    1)瞬时态 ——> 持久态
        Book book = new Book();
        session.save(book);

    2)瞬时态 ——> 脱管态
        book.setId(1); // 设置OID

持久态:
    Book book = (Book)session.get(Book.class, 1);
    get() / load() / find()  iterate()

    1)持久态 ——> 瞬时态
        session.delete(book); // 删掉之后就没有OID了

    2)持久态 ——> 脱管态
        session.close()
        clear() / evict(book) 将Session中的指定对象删除。

脱管态:
    Book book = new Book();
    book.setId(1);

    1)脱管 ——> 持久
        session.update(book);

    2)脱管 ——> 瞬时
        book.setId(null);

——持久态对象自动更新数据库

示例代码:

    /*
     * 持久态对象自动更新数据库
     */
    public void fun2(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
 
        // 获得一个持久态对象
        Book book = (Book)session.load(Book.class, 1);
 
        book.setName("Struts2");
 
        tx.commit(); // 当提交时会发送一条update语句,自动更新数据库数据,依赖的是Hibernate的一级缓存
        session.close();
    }

——总结

1、Hibernate持久化对象的状态:
    *   瞬时态
        没有唯一标识OID,没有与Session关联
    *   持久态
        有唯一标识OID,与Session关联
    *   脱管态
        有唯一标识OID,没有与Session关联

2、瞬时态对象
    User user = new User()
    瞬时态-->持久态
        session.save(user)
    瞬时态-->脱管态
        user.setId(1)

3、持久态对象
    get() / load()
    持久态-->瞬时态
        session.delete(Object)
    持久态-->脱管态
        session.close() / session.clear() / session.evice()

4、脱管态
    User user = new User();
    user.setId(1)
    脱管态-->瞬时态
        user.setId(null)
    脱管态-->持久态
        save() / saveOrUpdate()

Hibernate之持久化对象的更多相关文章

  1. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  2. hibernate中持久化对象的生命周期(转载)

    三态的基本概念 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: 2 ...

  3. hibernate中持久化对象的状态

    持久化对象有以下几种状态: 临时对象(Transient): 在使用代理主键的情况下,  OID 通常为 null  不处于 Session 的缓存中 在数据库中没有对应的记录 持久化对象(也叫”托管 ...

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

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

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

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

  6. Hibernate的持久化对象

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

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

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

  8. Hibernate(二)持久化对象的状态

    简介 以前学习Hibernate的笔记,整理一下便发出来了,防止弄丢.有错误的话麻烦各位留言评论,感激不尽. 持久化类 Hibernate完成了从面向对象模型表示的对象至关系模型表示的数据结构的映射, ...

  9. Hibernate的持久化对象配置

    定义Pojo对象和**.hbm.xml文件 -1 对于每一个需要持久化的对象都需要创建一个Pojo类定义,Hibernate要求POJO类定义中必须有一个no-argument的构造方法,便于Hibe ...

随机推荐

  1. Python+API接口测试框架设计(pytest)

    1.测试框架简介 整个接口测试框架的设计图如下: base:存放的是请求方法二次封装 common:存放的是自定义工具,操作excel,yaml文件等 data:存放的是公共动态数据,如data.xl ...

  2. 爬取千千小说 -- xpath

    今天以其中一本小说为例,讲一下下载小说的主体部分,了解正常的爬取步骤,用到的是request和xpath. 爬取数据三步走:访问url -->爬取数据 -->保存数据 一.访问千千小说网址 ...

  3. kubernetes/k8s CRI分析-容器运行时接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能.在此架构思想下,kubernetes ...

  4. 快速设置 JAVA_HOME

    快速设置 JAVA_HOME %SystemRoot%\System32\rundll32.exe sysdm.cpl,EditEnvironmentVariables

  5. Xshell 打开时,初始运行卡慢优化方法

    我使用的是Xshell 6免费版,有需要的同学可以去这个地址下载:https://www.netsarang.com/download/down_form.html?code=622 一开始安装完Xs ...

  6. 外网远程顶级域名连接群晖的WebDAV文件服务映射盘符

       外网远程顶级域名连接群晖的WebDAV文件服务映射盘符 https://www.cnblogs.com/delphixx/p/11846546.html 电子文件管理规范   1.手机拍照截屏 ...

  7. DC-4 靶机渗透测试

    DC-4 渗透测试 冲冲冲,努力学习 .掌握 hydra ,nc反弹shell 记住你要干嘛, 找地方上传shell(大多以后台登录为切入点,再反弹shell),shell提权到root 操作机:ka ...

  8. SpringBoot系列——动态定时任务

    前言 定时器是我们项目中经常会用到的,SpringBoot使用@Scheduled注解可以快速启用一个简单的定时器(详情请看我们之前的博客<SpringBoot系列--定时器>),然而这种 ...

  9. 洛谷P1377题解

    题面 首先他叫我们建一颗笛卡尔树,所以我们就建一颗笛卡尔树. 然后他说要生成序列中最小的.想到笛卡尔树的一条性质:左<根<右.但是根节点必须先插进去.他的两个儿子用贪心的思想就知道是先选左 ...

  10. pwnable.kr之brainf*ck

    pwnable.kr之brainf*ck 今天又是被难倒的一天Orz,个人感觉pwnable.kr上的题都比较剑走偏锋,仔细做过去,一定会有很大的收获. 不多说了,今天看的是第二关的第一道题:brai ...