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

时间:2010-04-04 06:16:35

标签: java hibernate orm

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

5 个答案:

答案 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个对象状态 -

  1. 瞬态
  2. 持久状态
  3. 分离状态
  4. 最好通过代码示例来理解 -

    让我们将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对象的更改和会话生命周期状态