站在持久化对象的角度,Hibernate吧对象分为4种状态:1:持久化状态,2:游离状态,3:临时状态,4:删除状态。值得提醒的是Session的特定方法能使对象从一个状态转到另一种状态。好,我们分别对这四种状态进行简略的解释。
为了简单清除明了,我画了一张图供大家参考
1:持久化状态:OID不为空,该对象在Session缓存中,持久化对象和数据库中的相关记录想对应。注意:在同一个Session缓存中,数据库表中的记录只对应一个持久化对象, 否则将会抛出异常!
2:临时状态:OID为空,该对象不在Session缓存中,在数据库中没有对应的记录。
3:游离状态:OID不为空,该对象不在Session缓存中,一般情况下,游离状态是持久化状态转变过来的,所以数据库中可能有与之相关的记录。
4:删除状态:在数据库中没有与其OID对应的记录,该对象也不在Session缓存中。
4种对象我们交代清楚了之后,我们在来看一下有哪几个Session特定的方法可以把对象从一个状态转变为另一种状态。
One by one
Session的save()方法使一个临时对象转变为一个持久化对象:
save()方法会完成以下操作:
1:把对象加入到Session缓存中去。
2:选用映射文件标识符生成器为持久化对象分配唯一的OID,是其成为持久化对象。
3:立即执行一条insert语句
如图:
执行结果为:
Session的get()和load()方法:
get和load方法都是从数据表中提取一条记录,但两者有显著地区别:
1:执行get() 方法会立即加载对象,若执行load()方法若不使用该对象,则不会立即做查询操作,而是返回一个对象的代理。
2:若数据库中没有相关的记录,get()方法会返回null,load()方法会抛异常org.hibernate.ObjectNotFoundException。
Session的update()方法:
update()方法使一个游离的对象转变为持久化对象,并计划执行一条update语句
注意事项:
若希望Session仅当修改了News对象的属性是才执行Update语句,可以把映射文件中的class元素的select-before-update 设为true,但通常不需要折磨做。
当update()方法关联一个游离对象时,如果Session的缓存中有相同OID的对象,则会抛出异常。
如图:
当update()方法关联的游离态的对象在数据库中没有相应的记录,则会抛异常。
如图:
saveOrUpdate()方法:
该方法会判断该对象是游离对象还是临时对象,从而调用不同的方法。
判断标准:对象的OID是不是为空。
如图测试结果:
结果为:
Session的delete()方法:可以删除一个游离对象,也可以删除一个持久化对象。
session的delete()方法的处理过程:
1:计划执行一条SQL语句。
2:把对象从session缓存中删除,该对象进入删除状态。
如图:
游离对象的操作:
持久化状态:
Hibernate 的cfg.xml 配置文件中有一个hibernate.use_identifier_rollback 属性若把它设为true将改变delete的运行过程,delete方法会把持久化对象或游离对象的OID设为null,使他们变为临时对象。