-
Hibernate对象的持久化状态
2015-07-30 14:58:12对Java Web开发处于初学阶段,之前从书上看到Hibernate对象的瞬态、持久化态、脱管态,都仅限于字面阅读,...对象是通过get方法获取的,于是进入持久化状态。处于持久化状态的对象,对其的修改,Hibernate会自动对Java Web开发处于初学阶段,之前从书上看到Hibernate对象的瞬态、持久化态、脱管态,都仅限于字面阅读,浅尝辄止。
进来在开发调试中,偶然发现将update语句注释掉之后,Hibernate仍然会发送update的SQL语句,百思不得其解,后逐步查资料发现是持久化状态的原因。
对象是通过get方法获取的,于是进入持久化状态。处于持久化状态的对象,对其的修改,Hibernate会自动检测到,并且在当前操作结束后(session结束之前)将对象数据写回数据库。无需显示调用update接口。
-
Hibernate持久化对象的状态
2017-06-04 21:14:09了解Hibernate持久化对象的状态可以很好的帮助我们理解hibernate_Session的核心方法,但是如果想要明白持久化对象在Hibernate中是怎么分类的,我们首先需要搞清楚什么是OID! 在关系数据库中,主键用来识别记录,并...了解Hibernate持久化对象的状态可以很好的帮助我们理解hibernate_Session的核心方法,但是如果想要明白持久化对象在Hibernate中是怎么分类的,我们首先需要搞清楚什么是OID!
在关系数据库中,主键用来识别记录,并保证每天记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两变量引用的对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系数据库中主键在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库中的对应关系。如下所示:
Transaction tx = session.beginTransaction();
User user1 = (User)session.load(User.class,new Long(1));
User user2 = (User)session.load(User.class,new Long(1));
User user3 = (User)session.load(User.class,new Long(3));应用程序在执行上述代码时,第一次OID为1的对象,从数据库中查找ID为1的记录,然后创建想要的User实例,并把它保存到session的缓存中,最后将该实例的引用赋值给变量user1,第二次加载OID为1的对象时,直接把session缓存中的OID为1的实例的引用赋值给user2,因此user1=user2的结果为true。
我们大致可以把Hibernate中的持久化对象的状态分为四种:临时状态,持久化状态,删除状态,游离状态。
1、临时状态(Transient)
在使用代理主键的情况下, OID 通常为 null
不处于 Session 的缓存中
在数据库中没有对应的记录2、持久化状态(也叫”托管”)(Persist)
OID 不为 null
位于 Session 缓存中
若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应
Session 在 flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象3、删除状态(Removed)
在数据库中没有和其 OID 对应的记录
不再处于 Session 缓存中
一般情况下, 应用程序不该再使用被删除的对象4、游离状态(也叫”脱管”) (Detached)
OID 不为 null
不再处于 Session 缓存中
一般情况下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录 -
Hibernate 持久化对象的状态
2018-02-06 15:37:081. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类。 * 持久化类 = JavaBean + xxx.hbm.xml 持久化类的编写规则 1. 提供一个无参数 public访问控制符的...什么是持久化类
1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类。
* 持久化类 = JavaBean + xxx.hbm.xml持久化类的编写规则
1. 提供一个无参数 public访问控制符的构造器 -- 底层需要进行反射.
2. 提供一个标识属性,映射数据表主键字段 -- 唯一标识OID.数据库中通过主键.Java对象通过地址确定对象.持久化类通过唯一标识 OID确定记录
3. 所有属性提供public访问控制符的 set或者get 方法
4. 标识属性应尽量使用基本数据类型的包装类型Hibernate 持久化对象的状态
1. Hibernate的持久化类
* 持久化类:Java类与数据库的某个表建立了映射关系.这个类就称为是持久化类.
* 持久化类 = Java类 + hbm的配置文件
2. Hibernate的持久化类的状态
* Hibernate为了管理持久化类:将持久化类分成了三个状态
* 瞬时态:Transient Object
* 没有持久化标识OID, 没有被纳入到Session对象的管理.
* 持久态:Persistent Object
* 有持久化标识OID,已经被纳入到Session对象的管理.
* 脱管态:Detached Object
* 有持久化标识OID,没有被纳入到Session对象的管理.Hibernate 持久化对象的状态的转换
1. 瞬时态 -- 没有持久化标识OID, 没有被纳入到Session对象的管理
* 获得瞬时态的对象
* User user = new User()
* 瞬时态对象转换持久态
* save()/saveOrUpdate();
* 瞬时态对象转换成脱管态
* user.setId(1)
2. 持久态 -- 有持久化标识OID,已经被纳入到Session对象的管理
* 获得持久态的对象
* get()/load();
* 持久态转换成瞬时态对象
* delete(); --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)
* 持久态对象转成脱管态对象
* session的close()/evict()/clear();
3. 脱管态 -- 有持久化标识OID,没有被纳入到Session对象的管理
* 获得托管态对象:不建议直接获得脱管态的对象.
* User user = new User();
* user.setId(1);
* 脱管态对象转换成持久态对象
* update();/saveOrUpdate()/lock();
* 脱管态对象转换成瞬时态对象
* user.setId(null);
4. 注意:持久态对象有自动更新数据库的能力!!!代码示例:
package com.kunaly.test; import java.io.Serializable; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.kunaly.domain.User; import com.kunaly.utils.HibernateUtils; /** * 持久化对象的三种状态 * @author Administrator * */ public class Demo03 { @Test public void run1() { // 获取session Session session = HibernateUtils.getSession(); Transaction tr = session.beginTransaction(); // 持久User的对象 // 瞬时态: 没有OID的值,也没有被session管理,此时的user对象是瞬时态对象 User user = new User(); user.setName("张飞"); user.setAge(38); // 使用session保存用户 // user对象中已经存在id的值,没默认情况下,把user对象也保存到session的缓存中 Serializable id = session.save(user); System.out.println("主键的值是"+id); // user 是持久态对象 tr.commit(); // session销毁,缓存没有了 session.close(); // 打印 // user对象存在id值,但是session销毁了,缓存不存在。 //session还管理user对象?废话,session都死了,还管理个屁啊 //此时的user是托管态的对象 System.out.println(user.getId()); System.out.println(user.getName()); } /** * 持久态的对象有自动更新数据库的能力 */ @Test public void run2() { Session session = HibernateUtils.getSession(); Transaction tr = session.beginTransaction(); // 获取持久态的对象 User user = session.get(User.class,1); System.out.println(user.getName()); // user 是持久态,有自动更新数据库的能力 // 重新设置新的名称 user.setName("刘玄德"); System.out.println(user.getName()); tr.commit(); session.close(); } }
-
hibernate 三种持久化对象的状态
2017-07-10 20:02:44使用对象new初始化的对象状态是瞬时的,也就是说没有跟任何数据库关联的行为,只要不应用这些对象,状态将会丢失,并有垃圾回收机制回收。 特征: 1、不处于Session的缓存中,不跟任何一个Session实例关联。 2、...临时状态:
使用对象new初始化的对象状态是瞬时的,也就是说没有跟任何数据库关联的行为,只要不应用这些对象,状态将会丢失,并有垃圾回收机制回收。
特征:
1、不处于Session的缓存中,不跟任何一个Session实例关联。
2、在数据库没记录。
以下情况下,Java对象进入临时状态
通过new语句创建一个java对象,处于临时状态。
Session的delete()方法能使持久化或者游离(脱管)的对象转换为临时状态的对象。
持久化状态:持久化对象是任何具有数据库标识的实例。由Session统一管理,持久实例是在事务中进行操作的。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中.
持久化对象总是与Session和Transaction关联在一起,在一个session中,对持久化对象的操作不会立即写到数据库,只有当Transaction(事务)结束时,才真正的对数据库更新,从而完成持久化对象和数据库的同步。在同步之前的持久化对象成为脏对象。
游离(脱管)状态:Session 关闭后 ,持久化状态的对象就成了离线对象。离线表示这个对象不能再与数据库保持同步。
与瞬时状态的区别是:离线对象是有持久化对象转过来的,数据库可能存在对应的记录。瞬时状态则无。
Session一下方法会让持久化状态变为游离状态的对象:close()//清空缓存,如没继续引用,结束生命周期,evict()//从缓存中删除一个持久化对象;
-
hibernate持久化对象的四个状态
2017-09-21 22:12:35持久化操作是Hibernate的核心。Hibernate的实例状态分为4种: 1、瞬时状态(Transient) 2、持久化状态(Persistent) 3、游离状态(Detached) 4、删除状态瞬时状态(Transient) 通过new开辟内存空间创建的... -
hibernate的持久化对象的三种状态
2014-10-23 14:55:12在Hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,脱管态。 1. 瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下: a) 不在Session的缓存中,不与任何的Se -
【Hibernate】持久化对象的三种状态
2017-02-02 10:03:24瞬时对象(Transient object):使用new操作符初始化的对象不是... 持久化对象(Persist object):持久化实例是任何具有数据库标识的实例,他有持久化管理器Session来统一管理,持久实例是在事务过程中进行操作的,通过sq -
Hibernate中持久化对象的三种状态简述
2018-12-04 21:26:27在Hibernate中持久化类的对象可以划分为三种状态,分别是: 瞬态,持久态,脱管态。 一、瞬时状态(Transient) 瞬时对象特点: (1) 不和 Session 实例关联 (2) 在数据库中没有和瞬时对象关联的记录 通过Java的new... -
Hibernate持久化对象的三种状态
2014-03-03 17:23:58Hibernate持久化对象的三种状态 ...在Hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,脱管态。 1. 瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下: a) 不在Se -
【Hibernate】——持久化对象的三种状态
2017-05-21 19:22:10在hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,离线态。 【导图】 持久化对象的三种状态是可以相互转化的,具体转换过程如图所示: 【分析】 瞬时状态: 使用new操作符初始化 -
4.2.2 更新detached对象的持久化状态
2010-05-11 20:21:00在session关闭之后再去修改user不会对数据库中的数据造成任何影响。当session被关闭之后,user变成了一个detached对象。需要通过update()或者lock()方法来重新和一个新的session关联。...重要的是通过update()方 -
Hibernate学习总结(4)——持久化对象的三种状态
2018-05-26 20:37:50hibernate中的持久化对象具有三种状态,分别是:瞬时状态、持久化状态、脱管状态。1.瞬时状态(Transient):实体对象是通过Java中的new关键字开辟内存空间创建的Java对象,但是它并没有纳入Hibernate Session 的... -
【Hibernate框架学习】:Hibernate进阶之持久化对象状态
2016-12-08 18:35:50我们都知道,Java对象的生命周期,是从通过new语句创建开始,到不再被任何引用变量引用结束,结束后它占 用的内存将被JVM垃圾回收机制收回。在Hibernate持久化对象可以划分为三种状态,瞬时对象(Transient ... -
Hibernate持久化对象的三种状态 .
2011-09-12 23:27:00在Hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,脱管态。 1. 瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下: a) 不在Session的缓存中,不与任何的Session实例相关联... -
hibernate学习——实体对象状态(瞬时、持久化、游离)
2018-12-03 14:59:04使用Hibernate框架后,对数据库的操作已经不是开发人员书写的代码直接操作的了,而是通过操作实体对象的状态,然后框架内部的功能模块会根据实体对象的状态来执行响应的操作。 Hibernate框架中,实体对象的状态... -
Hibernate 对象的三种状态 持久状态 临时状态 游离状态
2016-07-25 19:33:05Hibernate里有三种对象状态:临时状态 (Transient)、持久状态(Persistent)、游离状态(Detached) 持久状态对象也叫PO (PersistentObject... 临时状态对象是通过实例化的方式注入到内存中,也就是通过New的方式来开辟内 -
【工作笔记】Hibernate缓存分类和持久化对象的三种状态
2021-02-19 11:26:29于是就有了今天这篇文章…其实我是知道二级缓存的存在的,但是对于持久化对象的三种状态…没办法,我菜呗 凡技术必官网 官网 Hibernate缓存分类 Session缓存 介绍:Hibernate 内置的一级缓存,默认开启 缓存...
-
第三章 C语言 PTA循环控制——作业-答案.html
-
日本三菱公司FX系列PLC通信调试工具(含源代码)
-
[全案]非付费推广之QQ群推广方案(2011年4月1日更新).pdf
-
JMETER 性能测试基础课程
-
抖音任务点赞平台源码.zip
-
华为1+X认证——网络系统建设与运维(初级)
-
Algorithm_BaekJoon:백준리즘제문-源码
-
【考研初试】安徽建筑大学903流体力学考研真题库资料
-
朱老师c++课程第3部分-3.5STL的其他容器讲解
-
数据库面试题【七、InnoDB索引和MyISAM索引的区别】
-
C/C++反汇编解密
-
大数据分析关键技术.pptx
-
架构的稳定性
-
公共信用信息分类与编码规范(试行).pdf
-
MySQL Router 实现高可用、负载均衡、读写分离
-
python,numpy中np.random.choice()解释
-
qengine:基于查询的处理引擎-源码
-
【正点原子】I.MX6U网络环境TFTP&NFS搭建手册V1.2.pdf
-
一天学完MySQL数据库
-
jn82901336.github.io-源码