Hibernate持久化对象的生命周期详解

本文深入探讨了Hibernate中持久化对象的瞬时态、持久态和脱管态,详细解释了对象状态变化的过程及其对数据库操作的影响。

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

在Hibernate中,持久化对象在被操作过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的。所以Session对象的生命周期也关系着持久化对象的生命周期。
持久化对象的生命周期有三种,分别是瞬时态(Transient),持久态(Persistent)和脱管态(Detached)。
瞬时态的对象是刚刚用new关键字创建出来的,还没有进入Session,此时的对象没有和数据库中的记录对应。示例代码如下:
	User user = new User();
user.setName("Sarin");
user.setCity("大连");
user.setDepartment("研发部");
user.setPhone("15912345678");
user.setHireTime(new java.util.Date());

这时user就是出于瞬时态的持久化对象。
通过Session对象的save(),persist()或者saveOrUpdate()方法进行保存处于瞬时态的对象后,该对象就变为持久态。此时Session中已经存在该对象,并且对应数据库中的一条记录。值得注意的是在Session对象失效之前,对持久态对象的任何修改,在调用Session对象的close()方法或者Transaction对象的commit()方法之后,数据库表中对应的数据会同时更新。示例代码如下:
	SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("Sarin");
user.setCity("大连");
user.setDepartment("研发部");
user.setPhone("15912345678");
user.setHireTime(new java.util.Date());
session.save(user);
tx.commit();

在调用save()方法后,持久化对象user就变为持久态,但是执行了commit()方法之后,数据库操作才会进行,这点必须明确。所以在数据库操作执行之前对持久化对象的修改Hibernate可以感知。
而且Session对象的get()和load()方法也可以返回一个持久态的对象,这个对象代表数据库表中的一条记录。
脱管态,这个要格外注意,不是托管态,是离开Session管理的状态。处于脱管态的持久化对象的标识符属性和数据库表中某条记录的主键对应,但是它脱离了Session的管理,再次对其操作时,Hibernate无法感知其变化。如下示例:
	SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("Sarin");
user.setCity("大连");
user.setDepartment("研发部");
user.setPhone("15912345678");
user.setHireTime(new java.util.Date());
session.save(user);
tx.commit();
user.setCity("北京");

虽然后来又修改了user对象的city属性,但是是在脱管态修改的,程序结束也不能再影响数据库中数据变化。处于脱管态的对象可以重新调用Session对象的update()方法回到持久态,否则Java虚拟机会在适当时间进行垃圾收集。重新持久化对象的过程如下:
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("Sarin");
user.setCity("大连");
user.setDepartment("研发部");
user.setPhone("15912345678");
user.setHireTime(new java.util.Date());
session.save(user);
tx.commit();
user.setCity("北京");
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
session.update(user);
tx.commit();

当使用Session对象的delete()方法删除数据后,处于持久态的对象失去和数据库数据的对应关系,此时的持久化对象将在适当时间被Java虚拟机进行垃圾收集。
	SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Integer(1));
session.delete(user);
tx.commit();

至此Hibernate中持久化对象的三种状态介绍完了。我们会发现处于瞬时态和脱管态的对象不在Hibernate的Session管理中,这时无论怎样修改对象的属性都不会影响数据库中的数据。而处于持久态的对象在Session对象执行close()方法或Transaction对象执行commit()方法时,数据库中数据会同步更新,这也是Hibernate对对象的“脏”数据进行检查的一种方式。
本文系作者的个人理解,欢迎交流。
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值