Hiberate 实体/持久化生命周期状态

Hiberate 实体/持久化生命周期状态

原文: https://howtodoinjava.com/hibernate/hibernate-entity-persistence-lifecycle-states/

如您所知, Hibernate 适用于应用使用new运算符创建的普通 Java 对象。 以原始形式(没有注解),hibernate 将无法识别您的 java 类; 但是当使用所需的注解正确注解它们时,hibernate 将能够识别它们,然后使用它们,例如,存储在数据库中,更新它们等。这些对象可以说是用 Hiberate 映射的。

给定一个映射到 Hibernate 的对象的实例,它可以处于四种不同状态中的任何一种:瞬态,持久,分离或删除。 今天,我们将在本教程中学习它们。

瞬态对象

瞬态对象存在于堆内存中。 Hibernate 不会管理瞬态对象,也不会对瞬态对象进行更改。

Transient objects are independent of Hibernate

瞬态对象独立于 Hibernate

要持久保存对瞬态对象的更改,您必须要求会话将瞬态对象保存到数据库,此时,Hibernate 会为该对象分配一个标识符,并将该对象标记为处于持久状态。

持久对象

持久对象存在于数据库中,并且 Hibernate 管理持久对象的持久化。

Persistent objects are maintained by Hibernate

持久对象由 Hibernate 维护

如果字段或属性在持久对象上发生更改,则当应用将更改标记为要提交时,Hibernate 将使数据库表示保持最新状态。

分离的对象

分离的对象在数据库中具有表示形式,但是对对象的更改将不会反映在数据库中,反之亦然。 下图显示了对象与数据库的临时分离。

Detached objects exist in the database but are not maintained by Hibernate

分离的对象存在于数据库中,但不能由 Hibernate 维护

可以通过关闭与之关联的会话来创建分离的对象,或者通过调用该会话的evict()方法将其从会话中逐出。

您可能考虑这样做的原因之一是从数据库中读取对象,修改对象在内存中的属性,然后将结果存储在数据库以外的其他位置。 这将是对对象进行深层复制的替代方法。

为了保留对分离对象所做的更改,应用必须将其重新附加到有效的 Hibernate 会话。 当您的应用通过引用分离对象在新会话上调用loadrefreshmergeupdate()save()方法之一时,分离实例可以与新的 Hibernate 会话关联。 调用之后,分离的对象将是由新的 Hibernate 会话管理的持久对象。

删除的对象

删除的对象是由 Hibernate 管理的对象(换句话说,是持久对象),已传递给会话的remove()方法。 当应用将会话中保存的更改标记为要提交时,将删除数据库中与已删除对象相对应的条目。

现在,我们不要记下本教程的要点。

项目要点

  1. 新创建的 POJO 对象将处于瞬态状态。 瞬态对象不代表数据库的任何行,即不与任何会话对象相关联。 它是简单的简单 Java 对象。
  2. 持久对象代表数据库的一行,并且始终与某些唯一的 Hiberate 会话相关联。 Hiberate 跟踪对持久对象的更改,并在提交调用时将其保存到数据库中。
  3. 分离的对象是过去曾经持久化的对象,现在它们不再持久化。 要保留对分离对象所做的更改,必须将它们重新连接以 Hiberate 会话。
  4. 删除的对象是已传递给会话的remove()方法的持久对象,并且一旦将会话中保存的更改提交给数据库,它们就会很快被删除。

祝您学习愉快!