前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hibernate中的三种状态

Hibernate中的三种状态

作者头像
爱撒谎的男孩
发布2019-12-31 15:01:14
5140
发布2019-12-31 15:01:14
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

  1. 1. Hibernate中的三种状态
    1. 1.1. 临时态(瞬时态)
      1. 1.1.1. 特征
      2. 1.1.2. 转换
    2. 1.2. 持久态
      1. 1.2.1. 特点
    3. 1.3. 游离态(脱管态)
    4. 1.4. 参考文章

Hibernate中的三种状态

  • 在Hibernate中可以将实体对象看成3种状态,分别是临时态,持久态,游离态

临时态(瞬时态)

特征

  • 临时态的对象可以被垃圾回收
  • 临时态的对象未经过持久化,没有和session关联(没有经过session存储和查找)

转换

  • 新new出来的对象就是临时态
  • 在Hibernate中,可通过 session的save()或saveOrUpdate()方法将临时对象与数据库相关联,并将数据对应的插入数据库中,此时该临时对象转变成持久化对象.
代码语言:javascript
复制
Student st=new Student();   //此时的对象是临时态
st.setName("陈加兵");

持久态

  • 处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.通过session的get()load()等方法获得的对象都是持久对象。
  • 持久态的对象与session关联
  • 在数据库中有与之关联的数据
代码语言:javascript
复制
//使用get方法获取id=2的对象,此时的Student是持久态
Student student=session.get(Student.class, 2);

特点

  • session.save()方法将一个临时态的对象转换成持久态
代码语言:javascript
复制
//新建的Student对象,这个是临时态对象,并没有数据库关联
Student student = new Student();
student.setAge(22);
student.setName("陈加兵");
// 保存数据到数据库,此时的student就是一个持久态的对象,与session有了关联,并且数据库中也有了这条数据
session.save(student);
  • Session的update()方法 将一个游离对象转变为持久对象
    • 不能调用save()方法,因为游离态对象在数据库中是对应着一条数据的(数据库中有id的值与其对应),如果此时调用save()方法,那么就会向其中插入一条数据(此时的主键是自增长的)。因此要想一个游离态的对象变成持久态的对象,必须使用update()方法
代码语言:javascript
复制
@Test
	public void Test() {
		Session session = null;
		Transaction transaction = null;
		try {
			// 创建session
			session = HibernateUntil.getSession();
			// 开始事务
			transaction = session.beginTransaction();
			//此时的student为临时态
			Student student=new Student();
			//设置了id的值,并且这个id=2在数据库中有这么一条数据,因此是游离态
			student.setId(2);
			//调用了update()方法,此时变成持久态的对象
			session.update(student);
			transaction.commit();
		} catch (Exception exception) {
			transaction.rollback(); // 事务回滚
		} finally {
			if (session!=null) {
				session.close();
			}

		}
	}
  • 只要是这个持久态的对象的数据和数据库中的数据不相同了,不需要主动的调用update()方法,在执行的时候会自动的更新到数据库中。如果比较之后发现对象中的属性是相同的,那么即使调用了update()方法,也不会发出sql的更新语句。
代码语言:javascript
复制
	@Test
	public void TestPersit() {
		Session session = null;
		Transaction transaction = null;
		try {
			// 创建session
			session = HibernateUntil.getSession();
			// 开始事务
			transaction = session.beginTransaction();
			//使用get方法获取id=2的对象,此时的Student是持久态
			Student student=session.get(Student.class, 2);
			//修改了持久态的对象,这里只要session提交了就会自动更新到数据库中,不需要使用update()方法
			student.setName("陈加兵");
			//更新Student对象到数据库中,但是student是持久态,因此这里的语句是多余
//			session.update(student);
			// 提交事务
			transaction.commit();
		} catch (Exception exception) {
			transaction.rollback(); // 事务回滚
		} finally {
			if (session!=null) {
				session.close();
			}

		}
	}
  • Session的lock()方法: 调用lock()方法将对象同Session相关联而不强制更新。
  • Session的merge()方法: 拷贝指定对象的状态到具有相同对象标识符的持久对象。
  • Session的saveOrUpdate()方法: saveOrUpdate() 方法对于临时对象,执行save()方法,对于游离对象,执行update()方法。
  • Session的load()和get()方法: load()方法和get()方法都可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。
  • Session的 delete()方法: delete()方法用于从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条 delete语句。如果传入的参数是游离对象,先使分离对象与Session关联,使它变为持久化对象,然后才计划执行一个delete语句。
  • Session 的evict()方法: evict()方法从Session的缓存中删除一个持久对象。

游离态(脱管态)

  • 当与某持久对象关联的session被关闭后,该持久对象转变为游离对象.当游离对象被重新关联到session上 时,又再次转变成持久对象(在Detached其间的改动将被持久化到数据库中)。 游离对象拥有数据库的识别值,但已不在持久化管理范围之内。
  • 对象中有id的值(这个id的值对应数据库中的数据),但是和session没有关联
代码语言:javascript
复制
Student student2=new Student();
student.setId(2);  //设置了id的值,这个id的值在数据库中对应一条记录
student.setName("陈加兵");

参考文章

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hibernate中的三种状态
    • 临时态(瞬时态)
      • 特征
      • 转换
    • 持久态
      • 特点
    • 游离态(脱管态)
      • 参考文章
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档