教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

Java培训:持久化对象的状态及状态转换

更新时间:2023年02月13日11时05分 来源:传智教育 浏览次数:

好口碑IT培训

  Hibernate是持久层的ORM框架,专注于数据的持久化工作。在进行数据持久化操作时,持久化对象可能处于不同的状态当中,这些状态可分为三种,分别为瞬时态、持久态和多管态。

  1.瞬时态(transient)

  瞬时态也称为临时态或自由态,瞬时态的对象是由new关键字开辟内存空间的对象,不存在持久化标识OID(相当于主键值),且未与任何的Session实例相关联,在数据库中也没有记录,失去引用后将被JVM回收。瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系。

  2.持久态(persistent)

  持久态的对象存在一个持久化标识OID,当对象加入到Session缓存中时,就与Session实例相关联。它在数据库中存在与之对应的记录,每条记录只对应唯一的持久化对象。需要注意的是,持久态对象是在事务还未提交之前变成持久态的。

  3.脱管态(detached)

  脱管态也称离线态或者游离态,当持久化对象与Session断开时就变成了脱管态,但是脱管态依然存在持久化标识OID,只是失去了与当前Session的关联。需要注意的是,脱管态对象发生改变时Hibernate是不能检测到的。

  在Hibernate运行时,持久化对象的三种状态是可以通过一系列的方法进行转换的。这三种状态之间的转换关系如图24-1所示。

持久化对象的状态转换

  图24-1 持久化对象的状态转换

  从图24-1中可以看出,当一个对象通过new关键字创建后,该对象处于瞬时态;当对瞬时态对象执行Session的save()或saveOrUpdate()方法后,该对象将被放入Session的一级缓存中,此时该对象处于持久态;当对持久态对象执行evict()、close()或clear()操作后,对象会进入脱管态;当直接执行Session的get()、load()、find()或iterate()等方法从数据库中查询出对象时,查询到的对象也会处于持久态;当对数据库中的记录进行update()、saveOrUpdate()以及lock()等操作后,此时脱管态的对象就过渡到持久态;由于瞬时态和会在一段时间后被JVM回收。

0 分享到:
和我们在线交谈!