专栏首页码猿技术专栏Hibernate中的三种状态

Hibernate中的三种状态

文章目录

  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()方法将临时对象与数据库相关联,并将数据对应的插入数据库中,此时该临时对象转变成持久化对象.
Student st=new Student();   //此时的对象是临时态
st.setName("陈加兵");

持久态

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

特点

  • session.save()方法将一个临时态的对象转换成持久态
//新建的Student对象,这个是临时态对象,并没有数据库关联
Student student = new Student();
student.setAge(22);
student.setName("陈加兵");
// 保存数据到数据库,此时的student就是一个持久态的对象,与session有了关联,并且数据库中也有了这条数据
session.save(student);
  • Session的update()方法 将一个游离对象转变为持久对象
    • 不能调用save()方法,因为游离态对象在数据库中是对应着一条数据的(数据库中有id的值与其对应),如果此时调用save()方法,那么就会向其中插入一条数据(此时的主键是自增长的)。因此要想一个游离态的对象变成持久态的对象,必须使用update()方法
@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的更新语句。
	@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没有关联
Student student2=new Student();
student.setId(2);  //设置了id的值,这个id的值在数据库中对应一条记录
student.setName("陈加兵");

参考文章

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hibernate常用API

    爱撒谎的男孩
  • Hibernate之一级缓存

    爱撒谎的男孩
  • Java IO学习笔记六

    爱撒谎的男孩
  • Hibernate中 对象 的三种状态

    qubianzhong
  • 性能优化的首要法则

    大部分人需要他们的系统运行得更快,那么从哪里开始呢?大部分profiler工具都有内存跟踪 CPU跟踪,既然我们想让我们的程序跑得更快,那当然应该是盯着CPU了...

    物流IT圈
  • npm使用国内镜像加速的几种方法

    在使用npm过程中经常会遇到无法下载包的问题,本人在这里整理了几个npm使用国内镜像加速的方法,希望对大家有所帮助。

    天天向上_82634
  • 想申请用户体验设计实习?先看这六大建议!

    对学生而言,从学生身份过渡到职场人士身份,最重要的一个阶段就是实习期。假期实习是他们自己作为用户体验专业人士的重要一步。实习是一个巨大的机会,可以在很短的时间...

    奔跑的小鹿
  • Mockito框架学习之stub then return

    Jerry Wang
  • Java--类和对象之基础知识

    SuperHeroes
  • 《SQL必知必会》读书笔记,30分钟入门SQL!

    来源:https://segmentfault.com/p/1210000011760973/read

    猴哥yuri

扫码关注云+社区

领取腾讯云代金券