Hibernate持久化对象的状态

本文详细介绍了Hibernate中对象的三种状态:瞬时态、持久态和脱管态,并解释了这些状态之间的转换方式及如何通过代码进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate持久化对象存在三种状态:
transient(瞬时态), 尚未与Hibernate Session关联对象,被认为处于瞬时状态,失去引用将被JVM回收,无持久化标识OID,未与Session关联

persistent(持久态) 数据库中有数据与之对应并与当前session有关联,并且相关联的session没有关闭数据库并且事务未提交 ,存在持久化标识OID,与Session关联

detached(脱管态) 数据库中有数据与之对应,但当前没有session与之关联,脱管状态改变hibernate不能检测到,存在持久化标识OID,未与Session关联

持久化对象状态转换
瞬时转换:
瞬时 --> 持久 :执行save() , saveOrUpdate()
瞬时 --> 脱管 :手动设置OID,(删除)

持久转换:
持久 --> 瞬时 :执行delete()
持久 --> 脱管 :与session取消关系,evict(obj),close(),clear()

脱管转换:
脱管 --> 瞬时 :手动移除OID
脱管 --> 持久 :执行update,saveOrUpdate()

这里写图片描述

测试hibernate中java对象的状态

代码生命周期状态
tx = session.beginTransaction(); Customer c = new Customer();开始生命周期瞬时状态
Session.save©处于生命周期中转变为持久化状态
Long id=c.getId();c=null;Customer c2=(Customersession.load(Customer.class,id);tx.commit();处于生命周期中处于持久化状态
session.close();处于生命周期中转变为脱管态
c2.getName();处于生命周期中转变为脱管态
c2 = null;结束生命周期结束生命周期

对象的状态总结:

状态Session存在对应的记录数据中存在对应的记录
临时态nono
持久态yes可能有,也可能没有(持久对象,但数据库中没有)
游离态no可能有(数据没有删除)也可能没有

Coding Diary

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值