什么是休眠中的分离,持久和瞬态对象?

Jig*_*shi 92 java orm hibernate

什么是休眠中的分离,持久和瞬态对象?请举例说明.

Pas*_*ent 155

new其不与相关联的永久类的实例Session,有在数据库中并没有标识符值不表示被认为是瞬时的休眠:

Person person = new Person();
person.setName("Foobar");
// person is in a transient state
Run Code Online (Sandbox Code Playgroud)

持久实例具有在数据库中的表示,标识符值,并与一个相关联Session.您可以通过将瞬态实例与以下内容相关联来使其成为永久实例Session:

Long id = (Long) session.save(person);
// person is now in a persistent state
Run Code Online (Sandbox Code Playgroud)

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

所有这些都在整个第10章中得到了清楚的解释.使用 Hibernate文档的对象,我只是在上面解释.绝对是必读的.


小智 7

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

瞬态 - 使用new运算符实例化的对象称为瞬态对象.

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

持久性 - 具有与之关联的数据库标识的对象称为持久对象.

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

已分离 - 已分离的实例是一个持久的对象,但其会话已关闭.

分离的实例可以在以后的某个时间点重新连接到新的Session,使其再次持久化.此功能为需要用户思考的长时间运行工作单元启用编程模型.我们称之为应用程序事务,即从用户的角度来看工作单元.

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


Sab*_*esh 7

让我也从垃圾收集器的角度解释一下。

有 3 种休眠的对象状态(或)休眠的对象范围 -

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

最好通过代码示例来理解-

让我们将 POJO 类视为 Student Object->

Student student = new Student(); 
Run Code Online (Sandbox Code Playgroud)

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


当我们将此 POJO 对象附加到休眠会话时->

session.save(student);
Run Code Online (Sandbox Code Playgroud)

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

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


如果我们执行->

session.beginTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

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

(垃圾收集器的观点——GC 无法清除这个对象,因为这个 POJO 对象现在不在 JVM 的范围内,存储在数据库内部的表单表中。所以我们可以说这个数据库存储状态就像POJO 的永久存储对象


如果我们执行->

session.evict(student); 
Run Code Online (Sandbox Code Playgroud)

然后POJO对象被驱逐或从持久状态移除回分离状态。所以POJO对象的这种状态是分离状态

(垃圾收集器的观点——GC可以很容易地从JVM中清除掉处于分离状态的POJO对象)