代码之家  ›  专栏  ›  技术社区  ›  Jigar Joshi

在hibernate中什么是分离的、持久的和暂时的对象?

  •  85
  • Jigar Joshi  · 技术社区  · 15 年前

    在hibernate中什么是分离的、持久的和暂时的对象?请举例说明。

    5 回复  |  直到 8 年前
        1
  •  172
  •   FranciscoPedreira Pascal Thivent    7 年前

    A. new Session 瞬变

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

    A. 实例在数据库中具有表示形式、标识符值,并且与 . 你可以创建一个临时实例 将其与 会话

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

    现在,如果我们 close 冬眠 ,则持久实例将成为 独立的 会话 会话

    Chapter 10. Working with objects 我只是在上面解释的Hibernate文档。当然,是必读的。

        2
  •  10
  •   Sk Sharma    8 年前

    瞬态-使用新操作符实例化的对象称为瞬态对象。

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

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

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

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

        3
  •  7
  •   Sabunkar Tejas Sahailesh Aman Kumar Gupta    7 年前

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

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

    1. 瞬态
    2. 分离状态

    最好用一个代码示例来理解-

    让我们考虑一个POJO类作为学生对象-gt;

    Student student = new Student(); 
    

    现在,这个学生对象在 .


    session.save(student);
    

    现在这个POJO对象位于 持续状态

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


    如果我们执行->

    session.beginTransaction.commit();
    

    然后POJO对象处于永久或数据库存储状态

    (垃圾收集器的观点-GC无法清除此对象,因为此POJO对象现在不在JVM的范围内,并且存储在 )


    如果我们执行->

    session.evict(student); 
    

    然后POJO对象被逐出或从持久状态移回分离状态 分离状态 .

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

        4
  •  2
  •   O.Badr    7 年前

    鉴于以下实体:

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

    Hibernate 5.2 documentation (我还包括 removed

    实体刚刚被实例化,没有与 数据库,通常没有分配标识符值(除非 已使用指定的生成器)。

    City city = new City();
    

    实体具有关联的标识符,并且与

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

    但是,它被安排从 数据库。

    session.remove(city);
    


    注: hibernateapi提供了许多方法来在实体状态之间进行切换,我认为值得探索一个新的方法 Hibernate Session class .

        5
  •  0
  •   Amol Dixit    8 年前

    除了已经确定的正确答案外,持久的、暂时的、分离的只是hibernate中对象的状态。

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