Hibernate --- 对象的三种状态

一、Hibernate对象的三种状态

1.1 瞬时状态(Transient)

也叫做临时态或自由态,当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:
Customer customer=new Customer();

这时customer对象就处于瞬时状态,这是因为,此时customer只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说customer对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。

瞬时状态特点:
  • 不和 Session 实例关联
  • 在数据库中没有和瞬时对象关联的记录

1.2 持久状态(Persistent)

持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。如下所示:

Customer customer=new Customer();
tx=session.beginTransaction();
session.save(customer);
customer=(Customer)session.load(Customer.class,”1”);
customer.setAge(28);
tx.commit();

这时我们并没有显示调用session.update()方法来保存更新,但是对实体对象的修改还是会同步更新到数据库中,因为此时customer对象通过save方法保存进数据库后,已经是持久化对象了,然后通过load方法再次加载它,它仍然是持久化对象,所以它还处于Hibernate缓存的管理之中,这时当执行tx.commit()方法时,Hibernate会自动清理缓存,并且自动将持久化对象的属性变化同步到到数据库中。

持久的实例在数据库中有对应的记录,并拥有一个持久化标识 (identifier),持久对象总是与 Session 和 Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行 commit() 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏 (dirty) 对象。


持久化对象的特点:

  • 和 Session 实例关联
  • 在数据库中有和持久对象关联的记录


1.3 脱管状态(Detached)

也叫做游离态或离线态,当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。如下所示:

Customer customer=new Customer();
tx=session.beginTransaction();
session.save(customer);
customer=(Customer)session.load(Customer.class,”1”);
customer.setAge(28);
tx.commit();
session.close();

当session关闭后,customer对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与customer对象对应的数据记录,所以此时customer对象处于游离态,与持久对象关联的 Session 被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。

脱管对象特点:

  • 本质上和瞬时对象相同
  • 只是比瞬时对象多了一个数据库记录标识值 id.



二、Hibernate对象三种状态相互转化关系



2.1 瞬时状态转为持久状态

  • 使用Session对象的save()或saveOrUpdate()方法保存对象后,该对象的状态由瞬时状态转换为持久状态。
  • 使用Session对象的get()或load()方法获取对象,该对象的状态是持久状态。


2.2 持久状态转为瞬时状态

  • 执行Session对象的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时该对象没有与任何的数据库数据关联。


2.3 持久状态转为脱管状态

  • 执行了Session对象的evict()、clear()或close()方法,对象由原来的持久状态转为游离状态。


2.4 脱管状态转为持久状态

  • 重新获取Session对象,执行Session对象的update()或saveOrUpdate()方法,对象由游离状态转为持久状态,该对象再次与Session对象相关联。


2.5 脱管状态转为瞬时状态

  • 执行Session对象的delete()方法,对象由游离状态转为瞬时状态。

注意:处于瞬时状态或游离状态的对象不再被其他对象引用时,会被Java虚拟机按照垃圾回收机制处理。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate中的对象状态主要包括四种:瞬时状态(Transient)、持久状态(Persistent)、游离状态(Detached)和删除状态(Removed)。这些状态之间的转换关系如下: 1. 瞬时状态(Transient):当一个Java对象被创建并且没有任何与之关联的Session时,这个对象处于瞬时状态。此时,如果将该对象保存到数据库中,Hibernate会将其插入到数据库中,并且为其分配一个ID。 2. 持久状态(Persistent):当一个瞬时对象被关联到一个Session时,该对象就成为持久状态。此时,Hibernate会将该对象的信息保存到Session的缓存中,并将其与数据库中的记录建立关联。此时对该对象的任何修改都会被保存到数据库中。 3. 游离状态(Detached):当一个持久对象与Session的关联被解除时,该对象就成为游离状态。此时,Hibernate不再跟踪该对象状态,也不会将其修改保存到数据库中。如果需要更新该对象的信息,需要重新关联到Session中。 4. 删除状态(Removed):当一个持久对象被标记为删除时,该对象就成为删除状态。此时,Hibernate会将该对象的删除标记保存到Session的缓存中,并在提交事务时将其从数据库中删除。 需要注意的是,状态转换的过程是动态的,一个对象可能在不同的时间处于不同的状态Hibernate会根据对象状态自动执行相应的操作,开发者可以通过设置对象状态来实现对数据库的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值