hibernate学习笔记三
操纵持久化对象
当session的save()方法持久化一个对象时,该对象被载入缓存,以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中。当试图load()对象时,会判断缓存中是否存在该对象,有则返回。没有在查询数据库
清理session的缓存
Session具有一个缓存,位于缓存中的对象称为持久化对象来同步更新数据库(flush)
调用Transaction的commit()方法的时
缓存中持久化对象的属性已经发生了变化,会先清理缓存
flush:进行清理缓存(此时缓存中的数据并不丢失)的操作,让缓存和数据库同步执行一些列sql语句,但不提交事务,;
commit:先调用flush()方法,然后提交事务.则意味着提交事务意味着对数据库操作永久保存下来。
refresh:刷新,让session和数据库同步,执行查询,把数据库的最新信息显示出来,更新本地缓存的对象状态.
clear:清空缓存,等价于list.removeAll();
清理session的缓存(设置缓存的清理模式)
session.setFlushMode(FlushMode.AUTO);
在hibernate中java对象的状态
Hibernate把对象分为4种状态:
持久化状态,Persist调用session方法后
临时状态,transient对像刚创建时new
游离状态,DetachedOID不为null不再处于Session的缓存中session的close方法,evict()删除持久化对像
删除状态.Removedsession.delete(对像名);
操作持久化对像的方法
操纵持久化对象-save()使一个临时对象转变为持久化对象
操纵持久化对象-update()使一个游离对象转变为持久化并且计划执行一条update语句
若希望Session仅当修改了News对象的属性时,才执行update()语句,可以把映射文件中<class>元素的select-before-update(更新之前先查询)设为true
当update()方法关联一个游离对象时,如果在Session的缓存中已经存在相同OID的持久化对象,会抛出异常
当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常.
操纵持久化对象-saveOrupdate()如果参数是临时对象就用save方法,如果是游离对象就用update方法,如果是持久化对象就直接返回
如果参数是临时对象就用save方法
如果配置文件中(默认值为0)unsaved-value="值"与对像的id值相等的话就执行save();
操纵持久化对象-get()load()
区别:
当数据库中不存在与OID对应的记录时,load()方法抛出ObjectNotFoundException异常,而get()方法返回null
两者采用不同的延迟检索策略
操纵持久化对象-delete删除一个游离对象,也可以删除一个持久化对象