时间: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. Hive——元数据表含义

    Hive--元数据表含义 1.VERSION   -- 查询版本信息   Field Type Comment   VER_ID bigint(20) ID主键   SCHEMA_VERSION va ...

  2. 谷粒学院-2-mybatisplus

    一.参考文档 官网:http://mp.baomidou.com/ 参考教程:http://mp.baomidou.com/guide/ MyBatis-Plus(简称 MP)是一个 MyBatis ...

  3. 为了让她学画画——熬夜用canvas实现了一个画板

    前言 大家好,我是Fly, canvas真是个强大的东西,每天沉迷这个无法自拔, 可以做游戏,可以对图片处理,后面会给大家分享一篇,canvas实现两张图片找不同的功能, 听着是不是挺有意思的, 有点 ...

  4. java常见的面试题(二)

    1.mybatis 中 #{}和 ${}的区别是什么? #{}是预编译处理,${}是字符串替换: Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的 ...

  5. 记一次系统崩溃事件【Mac版】

    事件:Mac系统崩溃,导致电脑数据丢失,以及数据安全备份措施的不到位的教训! 解决措施: 1.开机后按:Command+R 按开机键 ,进入Mac 实用工具, 选择磁盘工具.由于没有备份直接抹掉磁盘. ...

  6. MySQL是怎么解决幻读问题的?

    前言 我们知道MySQL在可重复读隔离级别下别的事物提交的内容,是看不到的.而可提交隔离级别下是可以看到别的事务提交的.而如果我们的业务场景是在事物内同样的两个查询我们需要看到的数据都是一致的,不能被 ...

  7. js 日期转为时间戳

    在js中,将一个字符转化成Date型也不是什么难事:var str = '2013-08-30'; // 日期字符串str = str.replace(/-/g,'/'); // 将-替换成/,因为下 ...

  8. etcd raft 处理流程图系列1-raftexample

    最近在看raft相关的代码和实现,发现etcd的raft模块在实现上还是比较灵活的,但缺点就是需要用户实现比较多的功能,如存储和网络等,同时带来的优点就是不会对用户的存储和传输作限制.网上对该模块的描 ...

  9. Python中strip()、lstrip()、rstrip()函数的用法

    Python中使用函数strip().lstrip().rstrip()来剔除字符串前后的特定字符 函数语法为:str.strip(chars) 返回值是一个新的字符串,不更改源字符串 其中,参数ch ...

  10. XCTF-simple unpack

    题目提示这是一个加壳的二进制文件,拖到exeinfope,是UPX壳. 这里我们用linux命令upx -d脱壳. 脱完壳之后拉入ida64中分析.找到main函数,可以看到这一句可以是输出flag的 ...