Hibernate学习笔记(五)

基本概念
      瞬时状态:现在的理解是一种和hibernate无关的状态。这个状态现在感觉比较简单。因为其不涉及任何和hibernate相关的概念。他就是一个普普通通的类,不涉及任何实体化的对象。
                  其通过save(),saveOrUpdate(),persist(),merge()等方法编程持久化状态。
    持久化状态:就是进入数据库的的状态。
                   其通过delete(),remove()变成移除状态
                   evict(),close(),clear()变成托管状态
      移除状态: 就是一个垃圾。当然,有一个规范就是进入移除状态的不能够再次被使用。
      托管状态:书上说这个状态是最复杂的一个状态。因为其实介于被hibernate管理,但是不做不进数据库的一种状态。在这个状态中,其不保证与数据库同步。也不被放入持久化上下文。并通过重附和合并来恢复其持久化的身份。这个让我很难用言语表达出一个气特定的状态。
       
    持久化上下文:这个概念我觉得很复杂。现在的概念是他是一个池。一个处理持久化对象的池。它有检查脏数据和告诉缓存的作用。这是一个很模糊的概念。
   
    对象的同一性:同一性和java的同一性有着联系。其实Hibernate的作用并不是限于把数据库中的单条记录放入我们使用的对象,而产生一个新的对象。而是涉及类与记录的映射和管理。所以对于Hibernate来说,它需要考虑的一个问题是。其返回的对象和数据库中单条记录的对应的关系。而统一性就是从Hibernate中,在不同的时间点,通过相同或者不同的方法,范围的对象时候有着java中的同一性。
   而这种同一性和java中的同一性相等的范围有个名字叫做同一性的范围(scope of object identity)
   其分为3级
   第一级为没有。就是没有。第二级为持久层的上下文的范围。就是在一个持久化上下文的范围内,保证同一性。最后是过程范围的同一性。保证真个JVM有同一性。
   下面这段代码为hibernate中同一性的范例
    Session session1 = sessionFactory.openSession();
    Transaction tx1 = seesion1.beginTransaction();
    
     //Load Item with identifier value "1234"
    Object a = session1.get(Item.class,new Long(1234));
    Object b = session1.get(Item.class,new Long(1234));

    (a==b)         //true,persistent a and b are identical,因为在一个上下文范围内获取。

    tx1.commit();
    session1.close();

     //References a and b are now to an object in detached state
   //这里让我有了托管状态的感性认识

    Session session2 = sessionFactory.openSession();
    Transaction tx2 = seesion1.beginTransaction();
    
    //Load Item with identifier value "1234"
    Object c = session1.get(Item.class,new Long(1234));

    (a==c)        //false,detached  a and persistent c are not identical

    tx2.commit();
    session2.close();

    托管对象的同一性:
      搞清楚了同一性了,就明白了在Hibernate中,比较关心的是对象和数据库中表记录的一种对应,因为Hibernate关心的是数据库与代码运行时数据的同步问题。
      但是托管对象却有着一些不同。因为其不需要考虑与数据库中同步的问题。因为在Hibernate中,托管对象是和数据库断了线的一只风筝。保存着数据库中的数据,但是和数据库已然没有了任何的关系。所以对于Hibernate来说,其比较关系的已经是其值相等而不是对象相等了。
      所以在书中,也就强调了hascode()和equals()方法的重要性,同时,提出了业务键的概念。
   
     瞬时,脱管与持久化状态
       这三种状态表示的是Hibernate中的3种状态。其与Hibernate的关系分别从瞬时开始,由疏及亲。瞬时与Hibernate的关系最远,脱管次之,而持久化状态的关系最为亲密。
       瞬时对象就是和Hibernate一点关系都没有的对象,对于数据库来说,也没有任何记录与其对应。对于Hibernate来说,不知道其的存在。所以,在书中,被持久化的对象被delete之后,被称之为瞬时对象。
       脱管对象,我对其的理解是,产生这个对象的持久化上下文关闭之后,还存在的对象。这个对象,在数据库中有着一条记录与其对应,也只是对应而已。但是此时的Hibernate却不对这个对象进行任何的管理。除非你自己写sql语句,否则你完全没有办法知道这个对象是否和数据库同步。
       持久化对象,即使由Hibernate管理的对象。理论上来说,这个部分的对象会是最复杂的。因为其要牵涉到很多很多,比如说同步。但是操作上来说它却是最简单的。因为这些工作Hibernate都帮你完成了。这种对象,最常见的就是在上下文中被提取出来的。

      一个对象的三种状态的转换
         觉得,如果明白了以上的3个概念,那么对象之间的只是在使用api而已了。
         一个对象由瞬时,进入持久化,用的是save,因为此时是进入Hibernate的管理
         当一个持久化对象结束时,那么所有的对象统一变成了脱管,因为Hibernate所有的管理是封装在一个持久化上下文里面的。
         而由托管变成持久化对象。就是update(reattach),和merge。
         一个持久化对象变成瞬时,就是使用delete。
         其实所有的变化,无非就是进出持久化上下文。进,则变成持久化对象,出则变成脱管。如果数据库中没有记录与其对应(没进也没出)。那么也就是瞬时。

你可能感兴趣的:(编程,C++,c,Hibernate,C#)