【SSH】——Hibernate(1)持久化对象转换
2016-04-26 15:48
316 查看
一、Hibernate生命周期
实体对象的生命周期在Hibernate应用中是一个很关键的概念,正确的理解实体对象的生命周期将对我们应用Hibernate做持久层设计起到很大的作用.而所谓的实体对象的生命周期就是指实体对象由产生到被GC回收的一段过程.在这过程中我们需要理解的就是实体对象生命周期中的三种状态.瞬时状态(Transient)、持久化状态(Persistent)和离线状态(Detached也叫做脱管状态)。二、三种状态
1、瞬时状态(Transient)
使用new操作符初始化对象,并不是立刻就持久。在没有保存为数据库中的任何一个数据的时候,他们的状态都是瞬时的。或者说他们没有任何跟数据库表相关联的行为,也没有主键值,只要应用不再引用这些对象,他们的状态将会丢失,并由垃圾回收机制回收。如:public void TestA{
//这里的user对象,与数据库中的记录没有任何关联
TUser user=new TUser();
user.setName("yxm");
}
特点:不和任何一个Session实例关联。在数据库中没有对应的记录。
2、持久化状态(Persistent)
保存到数据库中后或者从数据库中取出的数据封装为对象,此时内存中的对象和数据库中的记录有对应关系,即和Session对象相关且Session对象尚未关闭,则此时实体对象处于Persistent状态。如果此时Session对象的delete方法删除记录,则Persistent状态的对象因为失去了对应资料,将会变成Transient状态。持久化对象由Session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束的时候同数据库进行同步。如:<span style="font-family:Microsoft YaHei;font-size:18px;">TUser user=new TUser();
TUser anotherUser=new TUser();
user.setName("yxm");
anotherUser.setName("Judy");
//此时user和anotherUser都处于Transient状态
Transaction tx=session.beginTransaction();
session.save(user);
//此时的user对象已经由hibernate纳入实体管理容器,处于persistent状态
//anotherUser仍是transient状态
tx.commit();
//事务提交后,数据库中插入一条用户yxm的记录,对anotheruser没有任何操作
Transaction tx1=session.beginTransaction();
user.setName("yxm_1"); //persistent
anotherUser.setName("Judy_1"); //transient
tx1.commit();
//虽然tx1事务中没有显示调用session.save方法保存user对象
//但是由于处于persistent状态的对象将自动被固化到数据库中,因此
//user对象的变化也将被同步到数据库中
//yxm的用户记录已经被更新为“yxm_1”
//时anotherUser仍然是一个普通java对象,处于transient状态,不受hibernate框架管理
//因此其属性的更改也不会对数据库产生影响
</span>
可以看到,处于transient状态的实体对象,可以通过session.save方法转换为persistent状态。同样,如果一个实体对象是由session.load方法获得,也处于persistent状态。
特点:持久化对象总是被一个session实例关联。和数据库中的相关记录对应。session在清理缓存时,会持久化对象的属性变化,来同步更新数据库。
3、托管状态(Detached)
Session关闭之后,持久化对象就变成detached对象。表示这个对象不能再与数据库保持同步,他们不再受到Hibernate管理。位于Detached状态的对象可以使用update方法使之与数据库中的记录重新发生关联,此时Detached状态的对象将变为Persistent状态。如:<span style="font-family:Microsoft YaHei;">TUser user=new TUser();
user.setName("yxm");
//此时user处于transient状态
Transaction tx=session.beginTransaction();
session.save(user);
//此时的user对象已经由hibernate纳入实体管理容器,处于persistent状态
tx.commit();
session.close();
//user对象此时状态为detached,以为与其关联的session已经关闭
Transaction tx1=session2.beginTransaction();
session2.update(user);
//此时处于detached状态的user对象再次借助session2由hibernate纳入管理器,回复persistent状态
user.setName("yxm_1");
//由于user对象再次处于persistent状态,因此其属性变更将自动由hibernate固化到数据库中
tx1.commit();
</span>
特点:不再位于session的缓存中,即它不再和session关联。它拥有持久化标识。
总结:
Transient和Detached状态的对象都不收hibernate持久层所管理,对这两个状态中的对象做任何属性的改变都不会对数据库中的资料有任何的影响。但是两者有什么区别呢?detached状态的对象,在执行save方法时,已经对对象进行了持久化,并赋予其主键值,可以唯一确定数据库表中的一条记录,能和数据库表中具备相同id值的记录相关联。只不过由于detached对象脱离了session这个数据操作平台,其状态改变无法更新到数据库中。而transient状态的对象与数据缺乏对应关系。
相关文章推荐
- Hibernate Oracle sequence的使用技巧
- jsp Hibernate批量更新和批量删除处理代码
- jsp hibernate的分页代码第1/3页
- Struts2+Hibernate实现数据分页的方法
- Hibernate环境搭建与配置方法(Hello world配置文件版)
- JAVA+Hibernate 无限级分类
- SSH整合中 hibernate托管给Spring得到SessionFactory
- jsp hibernate 数据保存操作的原理
- hibernate中的增删改查实现代码
- 解决hibernate+mysql写入数据库乱码
- java优化hibernate性能的几点建议
- java Hibernate延迟加载
- hibernate 常用方法介绍
- 详解Java的Hibernate框架中的注解与缓存
- 浅析Java的Hibernate框架中的继承关系设计
- Hibernate实现批量添加数据的方法
- Redis教程(十):持久化详解
- JQuery+Ajax+Struts2+Hibernate框架整合实现完整的登录注册
- 深入理解Hibernate中的flush机制
- Android持久化技术之文件的读取与写入实例详解