【Hibernate】(三)持久化对象的生命周期

      hibernate中,持久化对象在被操作过程中可以分为三种状态,这三种状态是和Session相关的,因为Hibernate中的操作都是基于Session完成的。所以Session对象的生命周期也关系着持久化对象的生命周期。

      持久化对象的生命周期有三种,分别是瞬时态(Transient),持久态(Persistent)和离线态(Detached)。 如下:

1、瞬时对象(Transient Objects

      使用new操作符初始化的对象不是立刻就持久的。他们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其他对象所引用),他们的状态将会丢失,并由垃圾回收机制回收。

2、持久化对象(Persist Objects

      持久实例是任何具有数据库标识的实例。他有持久化管理器Session统一管理,持久实例是在事务中进行操作的,他们的状态在事务结束时间数据库进行同步。当事务提交时,通过执行SQLinsertupdatedelete语句把内存中的状态同步到数据库中。

3、离线对象(Detached Objects

      Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。

 【状态特征】

瞬时态(Transient)

  • 没有被session管理
  • 在数据库中没有与之匹配的记录

持久态(Persistent)

  • 纳入session管理
  • 在数据库中有与之匹配的记录
  • 当属性发生改变,在清理缓存时(脏数据检查)会自动和数据库同步

离线态(Detached)

  • 没有被session管理
  • 在数据库中可能存在与之匹配的记录

      下面一张图来描述状态转换,或者说是各个状态的生命周期。


1】瞬时态(Transient)

      通过new语句刚创建一个对象时就直接进入了瞬时状态。如下:

//Transient状态
Useruser = new User();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(newDate());
user.setExpireTime(newDate());

2】进入持久态(Persistent)

      对象通过get方法或者load方法或者find方法或者iterate方法等直接进入瞬时态,下面小编以get方法和load方法为例来介绍。从数据库中获取信息,并将该信息同步到创建的user对象中,通过对比返回结果来对比get方法和load方法。如下:

1.get方法

public void testGet() {
    Session session = null;
    try {
        session = HibernateUtils.getSession();
        session.beginTransaction();
        // get加载上来的对象为持久对象
        // 执行get会马上发出查询语句
        User user = (User) session.get(User.class,
                "402895ab5ae5785b015ae5785c340001");
        System.out.println(user.getName());

        // Persistent状态
        // Persistent状态的对象,当对象的属性发生改变的时候
        // hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
        user.setName("赵柳");
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    } finally {
        HibernateUtils.closeSession(session);
    }
}

断点调试如下:


2.load方法

public void testLoad() {
    Session session = null;
    try {
        session = HibernateUtils.getSession();
        session.beginTransaction();
        //不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载)
        //什么叫lazy?只有真正使用这个对象的时候,再创建,对于hibernate来说
        //才真正的发出查询语句,主要是为了提高性能,lazy是hibernate中非常重要的特性
        //hibernate的lazy是如何实现的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的
        //而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类
        //生成代理,它采用的是继承方式
        User user = (User)session.load(User.class, "402895ab5ae5785b015ae5785c340001");
        System.out.println(user.getName());
        user.setName("王五");
        session.getTransaction().commit();
    }catch(Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    }finally {
        HibernateUtils.closeSession(session);
    }
}

断点调试返回结果如下图,


 

        对比get方法时的返回结果,load方法返回的不是User实体对象,而是通过CGLIB生成的代理对象。get不支持lazy,load在默认情况下支持lazy。get加载数据,如果不存在返回null,而load返回ObjectNotFoundException异常

3】进入离线态(Detached)

public void tesDelete() {
    Session session = null;
    try {
        session = HibernateUtils.getSession();
        session.beginTransaction();
        //手动构造Detached对象
        User user = new User();
        user.setId("40288081255351400125535142ac0001");
        session.delete(user);
        session.getTransaction().commit();
    }catch(Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    }finally {
        HibernateUtils.closeSession(session);
    }

}


原文地址:http://blog.csdn.net/u013036274/article/details/63687574

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值