时间: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. Day5 Scanner对象学习.

    Scanner对象 Java.until.Scanner 我们可以通过Scanner类来获取用户的输入. 基本语法: Scanner s = new Scanner (System . in) ; 通 ...

  2. vlc+flv.js 摄像头 H5 直播

    背景 业务需求:用最短的时间搞定摄像头直播到Web页面.因为没有过这方面经验,所以走了很多弯路,其实也不算弯路吧,大部分时间花在学习基础概念,寻找快速方案中.惯性思维想当然的以为找组件,配地址就能搞定 ...

  3. pip install 默认安装路径修改

    一.使用命令查看pip默认安装目录 python -m site 这里的USER_BASE和USER_SITE其实就是默认的启用Python通过pip自动下载的脚本和依赖安装包的基础路径. 接着使用命 ...

  4. 【贪心+排序】凌乱的yyy / 线段覆盖 luogu-1803

    题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...

  5. 数据结构与算法(python版)

    ADT抽象数据类型(ADT:Abstract Data Type):ADT是对数据进行处理的一种逻辑描述,并不涉及如何实现这些处理. 同一ADT可以采用不同的数据结构来实现:1.采用程序设计语言的控制 ...

  6. C++第三十六篇 -- 为第一个驱动程序进行调试

    工具是VMware12+Win10+VS2017+WDK1809 https://blog.csdn.net/qq_21763381/article/details/83242916 首先分清楚主计算 ...

  7. js学习笔记之自调用函数、闭包、原型链

     自调用函数 var name = 'world!'; // console.log(typeof name) (function () { console.log(this.name, name, ...

  8. 自学linux——4.Linux的自有服务(基础篇)

    linux自有服务(内置) 一.运行级别(模式) 在Linux中存在一个进程:init,进程id是1. 查看进程:#ps -ef|grep init 对应的配置文件:inittab(运行级别配置文件位 ...

  9. Android无障碍宝典-talkback

    http://geek.csdn.net/news/detail/93269 http://geek.csdn.net/news/detail/135867

  10. TCP三次握手、四次挥手理解

    tcp三次握手建立连接第一次握手 客户端发送给服务器一段连接请求报文,等待服务器回应 第二次握手 服务器收到报文,并发送给客户端一个确认报文,等待客户端回应 第三次握手 客户端收到新报文 ,再发送给服 ...