hibernate学习笔记02----持久化对象的状态转换

来源:互联网 发布:js 数组函数 编辑:程序博客网 时间:2024/06/05 18:10

Hibernate 将操作PO对象,状态分为三种

 瞬时 Transient) : 通常new 创建对象(持久化类),未与Session关联

持久 Persistent) : 在数据库存在对应实例拥有持久化标识OIDSession关联(受session管理)

脱管 Detached):当Session关闭后,持久状态对象与Session断开关联,称为脱管对象,此时也持有OID


HibernateJava对象的状态的转换代码示例:


编写hbm映射


<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- 配置映射 --><hibernate-mapping><!-- po和表的映射 --><class  name="cn.test.a_postate.Customer" table="t_customer"><!-- 主键 --><id name="id" column="id"><!-- 主键策略 --><generator class="native"/></id><!-- 其他属性 --><property name="name"/><property name="age"/></class></hibernate-mapping>



编写测试类:

//po状态@Testpublic void testSaveForPO(){//瞬时态:new一个对象//特点:未与session关联,没有OID,数据库没有该数据Customer customer = new Customer();customer.setName("Rose");customer.setAge(18);Session session = HibernateUtils.openSession();session.beginTransaction();//保存操作//持久态//特点:与session关联,“有OID,数据库有对应数据”//立刻发出insert语句,进行抢占数据库的主键ID,并且hb会将该id返回给posession.save(customer);session.getTransaction().commit();//脱管态//特点:与session失去联系,有OID,“数据库有对应数据”session.close();//session关闭}

三种状态的区别分析:

持久态和瞬时态、脱管态:容易区别,持久态主要特点是Session关联,而且数据库中有对应记录拥有OID,因此,只要与session关联的就是持久态

瞬时态和脱管态:相同点是都和Session没关联,不同点是瞬时态没有OID,而脱管态有OID


通过上述的分析,发现,瞬时态和脱管态对象就差一个OID,那么瞬时态的对象中给主键ID属性赋值后就是脱管态了么?

未必!

首先,需要区分持久化标识OID对象中主键ID属性的关系:

在持久化之前,虽然有ID属性,但数据库中没有对应的数据,那么此时OIDnull

在持久化之后,这个ID属性值被插入数据库中当主键了,数据库中有对应的数据了,此时OID就有值了,而且与主键值保持一致性,比如类型、长度等。

因此:OIDPO对象中主键ID属性的区别就是:数据库存在不存在,如果存在就是OID,如果不存在,那就是个ID属性而已。

 

瞬时态和脱管态的区别扩展:

脱管态对象:有持久化的标识oid,并且在数据库中存在。

瞬时态对象:无持久化标识oid,或者有id但在数据库中不存在的(自然主键情况)

 

例如:

Customer对象具有Id属性值,如果数据库中不存在,则该对象还是瞬时态对象,如果数据库中存在,则认为是脱管态的。

 

【三者的区别最终总结】:

对于三者:session中存在的,就是持久化对象不存在的就是瞬时或脱管对象

对于瞬时和脱管对象:oid(持久化标识)的就脱管对象,没有的就是瞬时对象



持久化对象状态的相互转换

持久化对象状态转换图(官方规范):

 

分解分析(对象的获取和如何转换到其他状态):

n 瞬时对象:

如何直接获得  --- new 出来

转换到持久态 ---- savesaveOrUpdate保存操作

转换到脱管态 ---- setId设置OID持久化标识(这个id是数据库中存在的) (不是规范中的)

n 持久对象

如何直接获得 ----通过session查询方法获得 getloadcreateQuerycreateCriteria

转换到瞬时态 ---- delete 删除操作 (数据表不存在对应记录 )(其实还有id,只是不叫OID

转换到脱管态 ---- close 关闭SessionevictclearSession清除对象

n 脱管对象

如何直接获得 ----- 无法直接获得 ,必须通过瞬时对象、持久对象转换获得

转换到瞬时态 ----id设置为null,或者手动将数据库的对应的数据删掉

转换到持久态 ---- updatesaveOrUpdatelock (对象重新放入Session,重新与session关联)





原创粉丝点击