Hibernate持久化对象状态
在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关.
各自是瞬时(Transient),持久太(persistent)和游离态(Detached)
瞬时状态
由new命令开辟内存的java对象.比如:Student
stu= newStudent();若没有变量对他引用,则被jvm回收.瞬时对象在内存中孤立存在,他的意义仅是携带信息的载体,不和数据库中的数据有不论什么的关联。通过session的save()和saveOrUpdate()方法能够把一个瞬时对象与数据库相关联,并把瞬时对象携带的信息通过配置文件所做的映射插入到数据库中,这个瞬时对象就成了持久化对象,拥有和数据库记录同样的id标示(Hibernate自己主动将id赋予它)
瞬时特点:
(1)不和Session实例关联
(2)在数据库中没有和瞬时对象关联的记录
持久态
持久的实例在数据库中有相应的记录.是Session和Transction相关联.在sessin中,持久对象改变不会立即对数据变更.而必须在Transcation终止,commit后,才与数据库进行同步.在此之前的持久太对象为脏对象.
使用 find,get ,load和iterater等方法查询的数据,都是持久对象.若一个瞬时对象被持久对象引用,则该对象也会变为持久对象.
假设使用delete()方法,它就会变为瞬时对象;当一个Session运行close()或clear()、evict()之后,持久对象就会变为托管对象。
持久特点:
(1)和Session实例关联
(2)在数据库中有和持久对象关联的记录
代码演示样例:
public void testSave()
{
Session session =null;
Transaction tx=null ;
try{
session= HibernateUtils.getSesion();
tx =session.beginTransaction(); //transient 瞬时状态
User user= new User();
user.setName("sdf");
user.setPassword("hanhan23");
user.setCreateTime(new Date());
//persistent, ,session引用,po持久
session.save(user); //被引用,成为持久状态//可是为脏对象
user.setName("lisd");
tx.commit();//
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//deteached状态关闭sesion后
}
以上演示样例演示瞬时态转为持久态对象
托管状态
与持久对象关联的Session被关闭后,对象变为托管。对托管对象的引用依旧有效,对象可继续被修改。托管对象假设又一次关联到某个新的Session上,会再次转变为持久的。托管状态期间的修改将会被持久化到数据库。
托管状态拥有数据库标识id,所以它能够通过update()、saveOrUpdate()和lock()等方法,再度与持久层关联。
托管特点:
(1)本质上和瞬时对象同样
(2)仅仅是比瞬时对象多了一个数据库记录标识值id
小结:
通过以上三种的对照,认识到,Hibernate中的对象是在session的管理进行数据的持久更新.状态之间的转换是与对象的生命周期息息相关.刚创建的内存中为游离态,若一旦被session保存为持久态(或被session引用).一旦sesion关闭或delete变为托管.学习之初,还请多多提意见.
Hibernate持久化对象状态的更多相关文章
- 1.1Hibernate持久化类和Hibernate持久化对象状态
一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...
- Hibernate持久化对象修改id重新保存的办法
Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二 2017年11月10日 20:16:48 筱光 阅读数:1122 版权声明:本文为博主原创文章,未经博主允许不得 ...
- hibernate 持久化对象 save
hibernate 持久化对象 save new出来的user对象是游离状态的对象,执行session.save()方法保存后,user对象就变为持久化了,持久化的对象跟数据库表双向绑定的意思, 对象 ...
- Hibernate持久化对象
持久化类应遵循的规则: 有无参构造器,构造器的修饰符>=默认访问控制符 有标识属性,映射数据库表的主键,建议使用基本类型的包装类 每个成员有setter和getter 非final修饰的类 重写 ...
- 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化
准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...
- Hibernate持久化对象的三种状态深入理解
关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...
- hibernate 持久化对象的三个状态
Hibernate中的对象有3种状态 瞬时对象(TransientObjects).持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象) Tran ...
- 【SSH系列】-- Hibernate持久化对象的三种状态
在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...
- Hibernate持久化对象的状态
1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态, 暂时状态, 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到还有一个状态 ...
随机推荐
- 64位系统/32位系统下/8位CPU的数据宽度
不同的编译器根据不同的 64 位模型有所不同. 比如 Visual C++,从第一个支持 64 位的版本起,一直就是使用 LLP64 内存模型,也就是说,编译出的代码除了 long 和指针是 64 位 ...
- BZOJ AC300题留念
- Eclipse开启与关闭代码自动提示功能
Eclipse代码里面的代码提示功能默认是关闭的,只有输入“.”的时候才会提示功能,用vs的用户可能不太习惯 这种,vs是输入任何字母都会提示,下面说一下如何修改eclipse配置,开启代码自 ...
- Python框架 Flask 项目实战教程
本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走.下载源码,运行pip install -r requirements.txt 建立环境python db_ ...
- c语言指针数组与数组指针
一.指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称.数 ...
- C语言实现单链表的逆置
单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决. 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...
- 结构体中使用#define定义宏
struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* ...
- ACM 做题过程中的一些小技巧。
ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...
- [转]使用xftp连接centos6.5
首先要在windows上安装xftp软件,这个是傻瓜式操作就不说了 安装完成之后,在centos上查看是否装了xftpd服务,[root@centos Desktop]# rpm -qa | grep ...
- 《Python爬虫学习系列教程》学习笔记
http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...