Hibernate持久化对象的三种状态及相互转化过程

1.Hibernate中持久化对象的三种状态

  Hibernate中持久化对象可以分为三种状态:瞬时态、持久态和脱管态。一个持久化类的实例可能处于三种不同状态中的一种。

  • 瞬时态(transient)------没有id,没与session进行关联

瞬时态也称为临时态或自由态,瞬时态的实例是由new命令创建、开辟内存空间的对象,不存在持久化表示OID(相当于主键值),尚未与Hibernate Session关联,在数据库中也没有记录,失去引用后将被JVM回收,瞬时状态的对象在内存中是孤立的,与数据库中的数据毫无关联,仅是一个信息携带的载体。

  • 持久态---------有id,与session进行了关联

持久态的对象存在持久化标识OID,加入到了Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录,每条记录只对应唯一的持久化对象,持久态对象是在事务还未提交前变成持久态的,持久化状态对象的任何变化都会自动同步到数据库中。

  • 脱管态-------有id,没与session进行关联

脱管态也称为离线状态或游离态,当某个持久化状态的实例与Session的关联被关闭时就变成脱管态。脱管态对象存在持久化标识OID,并且仍然与数据库中的数据存在关联,只是失去了与当前Session的关联,脱管状态对象发生改变时Hibernate不能检测到。

public void fun1(){
            
        Session session = hiberUtils.openSession();
    
        Transaction tx = session.beginTransaction();
        Customer c = new Customer();//------瞬时状态
        c.setCust_name("google公司");
        
        session.save(c);//--------持久化状态
        
        tx.commit();
        session.close();//------托管状态
        
    }

只要调用任何增删改查方法,对象即会与session对象建立关联,以save方法为例,save()并不是将对象进行保存而是将对象与session进行关联,例如生成oid,完成对象状态的转换。

 

 

持久化状态的特点:持久化状态对象的任何变化都会自动同步到数据库中。

 1 public void fun2()
 2        Configuration confiig=new Configuration().configure();
 3        SessionFactory sf=config.buildSessionFactory();    
 4        Session session=sf.getSession();
 5        Transaction tx=session.beginTransaction();
 6 
 7         Customer c=session.get(Customer.class,1l);//第二个参数为要查询的对象的id
 8         c.setCust_name("Google");
 9         
10         tx.commit();
11         session.close();       
12 
13 }

控制台的打印输出结果:

 1 Hibernate: 
 2     select
 3         customer0_.cust_id as cust1_0_0_,
 4         customer0_.cust_name as cust2_0_0_,
 5         customer0_.cust_source as cust3_0_0_,
 6         customer0_.cust_industry as cust4_0_0_,
 7         customer0_.cust_level as cust5_0_0_,
 8         customer0_.cust_linkman as cust6_0_0_,
 9         customer0_.cust_phone as cust7_0_0_,
10         customer0_.cust_mobile as cust8_0_0_ 
11     from
12         CUST customer0_ 
13     where
14         customer0_.cust_id=?
15 Customer{cust_id='4028e48d604887ef01604887f2450000', cust_name='Zah', cust_source='source', cust_industry='industry', cust_level='level', cust_linkman='Lis', cust_mobile='1222345', cust_phone='12234567'}
16 Hibernate: 
17     update
18         CUST 
19     set
20         cust_name=?,
21         cust_source=?,
22         cust_industry=?,
23         cust_level=?,
24         cust_linkman=?,
25         cust_phone=?,
26         cust_mobile=? 
27     where
28         cust_id=?

可以看到自动打印了一条update语句。

 

三种状态之间的转换:

  

所以session的get save update close方法总的来说是为了完成对象状态的转换,当我们需要修改数据库中的数据时,需要调用这些方法将对象转换为持久态。

 

posted @ 2017-11-23 23:14  Garcia11  阅读(480)  评论(0)    收藏  举报