基本概念
瞬时状态:现在的理解是一种和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。
其实所有的变化,无非就是进出持久化上下文。进,则变成持久化对象,出则变成脱管。如果数据库中没有记录与其对应(没进也没出)。那么也就是瞬时。