首页 > 技术文章 > Hibernate之对象的三种状态

miller-zou 2016-08-07 12:55 原文

                                                                                                                          Hibernate之Java对象的三种状态

一.简述

  本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/article/details/6436517。在此表示歉意和深深的谢意。如若各位读者在阅读的过程中发现有任何的纰漏或者错误,请及时之处,本人不胜感激,

  Hibernate中对象有三种状态: 临时状态(Transient)、持久状态(Persistent)、游离状态(Detached)。

  临时状态:刚刚使用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的状态的Java对象被称为临时对象。

  持久化状态:已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。

  游离状态:已经被持久化,但不处于session的缓存中。处于游离状态的Java对象被称为游离对象。

二. 具体的描述

2.1 代码描述

@Test
public void status(){
    //开启事务
    Transaction tx = session.beginTransaction();
        
    //此时customer处于临时状态,此时customer没有持有oid
    Customer customer = new Customer(); 
    customer.setName("NNNNNN");
    customer.setPhoneNum("223344");
        
    //此时对象持有了oid,与数据库建立的关联关系
    int id = (Integer)session.save(customer);
        
    //当使用load()或者get()方法的时候,不会发送任何的sql语句,而是直接从session缓存中获取。
    Customer customer1 = session.get(Customer.class, id);
        
    //结果为true,也就是说拿到的其实是同一个对象
    System.out.println(customer == customer1);
        
    customer.setName("YYYYYY"); 
    customer1.setName("BBBBBB");
        
    System.out.println(customer1.getName());  
        
    System.out.println("customer的Id为:" + customer.getId());
        
    //当事务提交时,实际会发送两条SQL:一条插入,一条更新
    tx.commit();
    //当session关闭后,customer处于游离状态
    session.close(); 
        
    System.out.println("当customer变为游离状态,依然持有oid: " + customer.getId());
        
    Session session2 = OracleSessionUtils.openSession();
    Transaction tx1 = session2.beginTransaction();
    //此时customer被重新纳入到session的缓存中, 由游离状态变为持久化状态
    session2.update(customer);  
    customer.setName("MMMMMM");
    customer.setName("OOOOOO");
    //事务再次提交,实际只会发送一条SQL
    tx1.commit();
    //customer在此从持久状态变为游离状态
    session2.close();
}

2.2 图片描述

  注:本图片也是摘自FG2006这为大神的博文。

2.3 对象状态转换的相关方法描述

get、load、find: 方法的使用上较为类似,get和find方法笔者暂时未发现任何的不同之处。他们都是将数据库中对应Id的数据映射为Java对象,此时对象变为持久化状态。

save: 保存,此时Java对象已经与数据库记录建立的关系。将对象从临时状态的变为持久化状态或者将游离状态的数据变为持久状态。

saveOrUpdate: 保存或者更新,如果没有与数据库记录所对应的oid,则执行保存,如果有,则执行更新。将对象从临时状态的变为持久化状态或者将游离状态的数据变为持久状态。

delete: 删除对象,将对象从持久化状态或者游离状态变为临时状态。

close: 关闭session, 先将session清空,然后再关闭。将对象从持久状态变为临时状态。

clear: 清空session缓存。将对象从持久状态变为临时状态。

evict: 清除指定的对象。将对象从持久状态变为临时状态。

 

推荐阅读