Hibernate学习笔记(2):对象的三种状态

来源:互联网 发布:eyeone软件 编辑:程序博客网 时间:2024/06/04 17:50

Hibernate学习笔记(2):对象的三种状态

以下是Hibernate文档里对对象三种状态的描述

  • 瞬时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)

  • 持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。

  • 脱管(Detached) - 与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。 对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上, 会再次转变为持久(Persistent)的(在Detached其间的改动将被持久化到数据库)。 这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work)的编程模型成为可能。 我们称之为应用程序事务,即从用户观点看是一个操作单元(unit of work)。

    三种状态的特征:

    transient状态的特征
    在数据库中没有与之匹配的数据
    没有纳入session的管理

    persistent状态的特征
    在数据库中有与之匹配的数据
    纳入了session的管理
    在清理缓存(脏数据检查)的时候,自动与数据库同步

    detached状态的特征
    在数据库中有与之对应的数据
    没有纳入session的管理
    可以手动构造detached状态的对象
    把ID设置为数据库中存在的即可

    实例:

    //创建User对象,此时对象为transient状态
    User user = new User();
    user.setName("HK");
    user.setAge(20);
    user.setBirth(new Date());

    //保存user对象,此时对象为persistent状态
    session.save(user);

    //因为此时user对象是persistent状态,可以自动与数据库同步,所以commit之后,数据库中的name值为Han
    user.setName("Han");

    //提交事务
    session.getTransaction().commit();

    //关闭session
    if(session.isOpen()) {
        session.clear();
    }

    //此时对象为detached状态,数据库中的值不会改变
    user.setName("HK");
  • 原创粉丝点击