时间: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. Java多线程系列-基本概念

    Java的线程基本用法 创建线程 创建线程的方法: 实现Runnable接口 首先我们查看Runnable接口的定义: package java.lang; @FunctionalInterface ...

  2. [SHOI2014]概率充电器 题解

    注意到本题的贡献是不带权的,所以期望其实就是每个点的概率之和. 本题正着做好像不是很好做,要考虑 \(P(A+B)=P(A)+P(B)-P(A)P(B)\) 的容斥(因为这是两个条件至少满足一个,所以 ...

  3. python开发,注意事项

    提高python代码运行效率 1.使用生成器,节约内存.[一边循环一边计算的机制,称为生成器:generator] 例: .如何创建生成器 1.只要把一个列表生成式的[]改成(),就创建了一个gene ...

  4. 【系统学习ES6】第一节:新的声明方式

    [系统学习ES6] 本专题旨在对ES6的常用技术点进行系统性梳理,帮助大家对其有更好的掌握.计划每周更新1-2篇,希望大家有所收获. 以前用ES5时,声明变量只能用var.ES6的出现,为我们带来了两 ...

  5. Synology群晖100TB万兆文件云服务器NAS存储池类别 RAID 6 (有数据保护)2021年7月29日 - Copy

    Synology群晖100TB万兆文件云服务器NAS存储池类别 RAID 6 (有数据保护)2021年7月29日 - Copy https://www.autoahk.com/archives/367 ...

  6. Maven-内部多个项目依赖自动升级版本的部署

    需要自动升级版本的AAA项目发布 (有内部依赖时) 步骤比较复杂, 有一些需要根据实际情况调整. 考虑了以下几种可能性: 依赖模块的版本有更新 依赖模块版本没更新 依赖模块的版本号: 直接定义, 用属 ...

  7. IDEA输出乱码“淇℃伅”

    尝试过在IDEA中tomcat的vmoptions中加入代码 -Dfile.encoding=GBK 没什么用 最后找到了这个方法 参考链接 ①在Tomcat文件夹下找到conf ②找到logging ...

  8. Vulhub-DC-2靶场

    Vulhub-DC-2靶场 前言 最近一直忙于学习代码审计和内网渗透,所以靶场这方面的文章一直未更新,但是计划是更新完DC系列靶场的,这个不会鸽. DC-2的靶场是很简单的一共5个flag. 正文 f ...

  9. C++员工管理系统(封装+多态+继承+分类化+函数调用+读写文件+指针+升序降序算法等一系列知识结合)

    1 C++职工管理系统 2 该项目实现 八个 功能 3 1-增加功能 2-显示功能 3-删除功能 4-修改功能 4 5-查找功能 6-排序功能 7-清空功能 8-退出功能 5 实现多个功能使用了多个C ...

  10. 神奇的 SQL 之别样的写法 → 行行比较

    开心一刻 昨晚我和我爸聊天 我:"爸,你怎么把烟戒了,也不出去喝酒了,是因为我妈不让,还是自己醒悟,开始爱惜自己啦?" 爸:"儿子啊,你说的都不对,是彩礼又涨价了.&qu ...