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方法总的来说是为了完成对象状态的转换,当我们需要修改数据库中的数据时,需要调用这些方法将对象转换为持久态。

浙公网安备 33010602011771号