什么是hibernate中的分离,持久和临时对象?

什么是hibernate中的分离,持久和临时对象? 请用一个例子来解释。

一个与Session没有关联的持久类的new实例在数据库中没有表示,并且没有标识符值被Hibernate认为是瞬态的:

 Person person = new Person(); person.setName("Foobar"); // person is in a transient state 

持久化实例在数据库中有一个表示forms,一个标识符值并且与一个Session相关联。 您可以通过将会话与Session关联来使暂时实例持久化

 Long id = (Long) session.save(person); // person is now in a persistent state 

现在,如果我们close Hibernate Session ,持久化实例将成为一个分离的实例:它不再附加到一个Session (但是仍然可以修改并重新附加到一个新的Session )。

所有这一切都清楚地解释了整个第10章。使用 Hibernate文档的对象 ,我只是在上面解释。 绝对必须阅读。

hibernate中的对象具有以下状态:

瞬态 – 使用新运算符实例化的对象称为瞬态对象。

如果一个对象刚刚使用new运算符进行了实例化,则该对象是暂时的,并且与Hibernate Session没有关联。 它在数据库中没有持久表示,并且没有分配标识符值。 如果应用程序不再拥有引用,则垃圾收集器将销毁瞬态实例。

持久性 – 具有与其关联的数据库标识的对象称为持久对象。

持久实例在数据库中有一个表示和一个标识符值。 它可能只是被保存或加载; 然而,它是根据定义在会议的范围内。 Hibernate将检测对持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。

分离 – 分离的实例是一个持久的对象,但其Session已经closures。

分离的实例可以在稍后的时间点重新附加到新的会话中,使其重新持续。 此function为需要用户思考时间的长时间运行的工作单元启用编程模型。 我们称之为应用程序事务,即从用户的angular度来看是一个工作单元。

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012

除了正确的答案已经确定持久性,瞬态,分离只是在hibernate状态的对象。

更准确地说,这三个状态实际上显示了hibernate对象的变化和会话生命周期状态

让我在垃圾收集器的angular度来解释也。

有3个hibernate的对象状态(或者)hibernate的对象范围 –

  1. 瞬态状态
  2. 持久状态
  3. 分离状态

用代码示例来理解更好 –

让我们考虑一个POJO类作为学生对象 – >

 Student student = new Student(); 

现在,这个学生对象处于暂态


当我们将这个POJO对象挂接到hibernate session->时

 session.save(student); 

现在这个POJO对象处于持久状态

(垃圾收集器的观点 – GC不能清除处于持久状态的任何对象,所以我们可以说持久化状态就像POJO对象的临时存储


如果我们执行 – >

 session.beginTransaction.commit(); 

那么POJO对象处于永久或数据库存储状态

(垃圾收集器的观点 – GC不能清除这个对象,因为这个POJO对象现在超出了JVM的范围,并且存储在一个数据库的表格表中。我们可以说这个数据库存储状态就像POJO的永久存储对象


如果我们执行 – >

 session.evict(student); 

那么POJO对象就会被驱逐或从持久状态移回到分离状态 。这种POJO对象的这种状态是分离状态

(垃圾收集器的angular度来看,GC可以轻松地从JVM中清除分离状态的POJO对象)

考虑以下实体:

 @Entity public class City { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; // other fields and methods. } 

从hibernate5.2文档 (我也包括removed状态):

短暂的

该实体刚刚被实例化,并且与持久性上下文没有关联。 它在数据库中没有持久表示,通常没有标识符值被分配(除非使用了分配的生成器)。

 City city = new City(); 

pipe理,或持久

该实体具有关联的标识符并且与持久性上下文相关联。 它可能在物理上也可能不存在于数据库中。

 // 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); 

超脱

该实体具有关联的标识符,但不再与持久化上下文相关联(通常是因为持久化上下文已closures或实例已从上下文中逐出)

 // city is in a detached state, Hibernate is no longer aware of the entity session.evict(city) 

我有

去除

该实体具有关联的标识符并且与持久化上下文相关联,但是其被安排从数据库中移除。

 session.remove(city); 

注意: Hibernate API提供了一些方法来在实体状态之间切换,我认为值得探讨一下Hibernate Session类 。