休眠中的分离,持久和瞬态对象是什么?请举例说明。
答案 0 :(得分:150)
与new
无关的持久化类的Session
实例在数据库中没有任何表示,并且没有标识符值被视为 transient < / strong>来自Hibernate:
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
持久性 实例在数据库中有一个表示形式,一个标识符值,并与Session
相关联。您可以通过将其与Session
相关联来创建一个瞬态实例 持久性 :
Long id = (Long) session.save(person);
// person is now in a persistent state
现在,如果我们close
Hibernate Session
,持久化实例将成为 分离的 实例:它不会附加到Session
了(但仍可以修改并稍后重新附加到新的Session
)。
所有这些都在Hibernate文档的整个Chapter 10. Working with objects中清楚地解释过,我只是在上面解释。绝对是必读的。
答案 1 :(得分:7)
hibernate中的对象具有以下状态:
瞬态 - 使用new运算符实例化的对象称为瞬态对象。
如果对象刚刚使用new运算符进行实例化,并且它与Hibernate会话无关,则该对象是瞬态的。它在数据库中没有持久表示,并且没有分配标识符值。如果应用程序不再持有引用,则垃圾收集器将销毁瞬态实例。
持久性 - 具有与之关联的数据库标识的对象称为持久对象。
持久化实例在数据库中具有表示形式和标识符值。它可能刚刚被保存或加载;但是,根据定义,它在会话的范围内。 Hibernate将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。
Detached - 分离的实例是一个持久的对象,但其Session已被关闭。
分离的实例可以在以后的某个时间点重新连接到新的Session,使其再次持久化。此功能为需要用户思考的长时间运行工作单元启用编程模型。我们称之为应用程序事务,即从用户的角度来看工作单元。
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
答案 2 :(得分:3)
让我在垃圾收集器的角度解释。
hibernate(或)Hibernate的对象范围有3个对象状态 -
最好通过代码示例来理解 -
让我们将POJO类视为学生对象 - &gt;
Student student = new Student();
现在,这个学生对象处于瞬态。
当我们将此POJO对象附加到hibernate session-&gt;
session.save(student);
现在这个POJO对象处于持久状态。
(垃圾收集器的观点 - GC无法消除任何处于持久状态的对象。 所以我们可以说持久状态就像 POJO对象的临时存储)
如果我们执行 - >
session.beginTransaction.commit();
然后POJO对象处于永久或数据库存储状态
(垃圾收集器的观点 - GC无法消除此对象,因为此POJO对象现在超出了JVM的范围并存储在 我们可以说这个数据库存储状态类似于 POJO对象的永久存储)
如果我们执行 - >
session.evict(student);
然后POJO对象被逐出或从持久状态移回到分离状态。这个POJO对象的状态是分离状态。
(垃圾收集器的观点 - GC可以轻松地从JVM中清除分离的状态POJO对象)
答案 3 :(得分:1)
鉴于以下实体:
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
来自Hibernate 5.2 documentation(我还包括removed
州):
<强>瞬态强>
实体刚刚被实例化,并且与a无关 持久化上下文。它没有持久的代表性 数据库,通常没有分配标识符值(除非 已使用指定的生成器。)
City city = new City();
托管或持续
该实体具有关联的标识符并与a关联 持久化上下文。它可能存在也可能不存在 数据库。
// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);
<强>分离强>
该实体具有关联的标识符,但不再关联 使用持久化上下文(通常是因为持久化上下文 关闭或实例被驱逐出上下文)
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
<强>除去强>
该实体具有关联的标识符并与a关联 持久化上下文,但它计划从中删除 数据库中。
session.remove(city);
注意:强>
Hibernate API提供了几种在实体状态之间切换的方法,我认为值得探索Hibernate Session class。
答案 4 :(得分:0)
除了已经确定的正确答案,持久性,瞬态,分离只是休眠状态下对象的状态。
更确切地说,这三个状态实际上显示了hibernate对象的更改和会话生命周期状态