Hibernate学习之持久化对象

Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置的,不能被卸载。
Hibernate的二级缓存是由SessionFactory提供的,他作为一个可插入的组件使用的,默认是不支持的,应用必须明确配置二级缓存才能使用.
Session缓存的作用:
降低数据库的访问频率
保证缓存中的对象与数据库中的相关记录保持同步

持久化对象的状态:
临时状态(Transient)    刚刚用new创建,还没有被持久化,还不处于Session缓存之中
持久化状态(Persistent)    已经被持久化,加入到Session的缓存之中
游离状态(Detached)    已经被持久化,但不再处于Session的缓存之中

判断一个对象处于怎样的状态 :

主要的依据是 : 1. 看该对象是否处于 session管理 ;2. 看在数据库中有没有对应的记录

瞬时态 : 没有 session 管理 , 同时数据库没有对应记录

持久态 : session 管理,同时在数据库中有记录

脱管态 / 游离态: 没有 session 管理,但是在数据库中有记录 .


临时对象 的特征:
不处于Session的缓存中
在数据库中没有对应的记录
以下情况会使对象进入临时状态:
当通过new语句刚创建了一个对象
Session的delete()方法会使一个对象从持久化状态或游离状态进入临时状态
持久化对象 的特征:
位于一个Session实例的缓存中
持久化对象和数据库中相关的记录对应
Session在清理缓存时,会根据持久化对象的属性的变化来同步更新数据库
Session的save()方法把临时对象变为持久化对象
Session的update(), saveOrUpdate(),lock()使对象从游离状态变成持久化状态。
Session的load()或get()方法返回的是持久化对象,find()方法返回的List元素
游离对象 的特征:
不再处于Session的缓存中
游离对象是从持久化对象转变过来的
调用Session的close()方法时,Session的缓存被清空,缓存中的持久化对象会变成游离对象
Session的evict()能从缓存中删除一个对象,使之从持久化状态变成游离状态

save()//保存对象
把临时对象加入到缓存中,使之成为持久化对象
使用指定的ID生成器为持久化对象分配OID
当对象处于持久化状态,Hibernate不允许修改其OID
update()//修改对象
把游离对象加入到缓存中,使一个游离对象变成持久化对象
计划执行update SQL语句,根据对象的OID来更新对象所对象的数据
update()不能更新一个在session中已经关联的相同OID的对象
saveOrUpdate()//保存或修改对象
同时包含了save()和update()方法的功能,根据对象的状态自动执行相应的功能
若对象为临时状态,执行save()方法,若为游离状态则执行update()方法
merge()    //合并对象
直接修改表中的记录,并不影响该对象原来的状态
contains()    //判断实体对象是否与Sesison关联
可以用此方法判断对象是否处于持久化状态
evict()     //把实体对象从Session缓存中移除
clear()     //清除Session缓存中所有的持久化对象
delete()    //删除指定的对象
配置级联删除
1. 设置cascade为“delete” 或 “all” 或 “save-update,delete”。 “all”与“save-update,delete”相同
学生和地址之间存在一对一的关系,如果希望删除学生信息时,同时删除地址信息,可以在学生这一头这样配置。
2.设置cascade=“delete-orphan”
班级和学生是一对多的关系,在班级的set元素中进行配置。更新班级对象时,检查set集合中缺少的学生对象,删除数据库中对应的学生记录。
get()
load()

两个方法的区别:

Books book=(Books) session.load(Books.class, 2);
都是根据指定的OID从数据库中加载一个持久化状态对象
当数据库中不存在与OID相对应的记录时,get()返回一个null引用,而load()方法会抛出ObjectNotFoundException异常
使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select ...), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)

通过修改配置文件,我们可以取消懒加载
<class  name="Employee" lazy="false" table="employee">
如何选择使用哪个: 如果你确定DB中有这个对象就用load(),不确定就用get()(这样效率高)

猜你喜欢

转载自chenzheng8975.iteye.com/blog/1669911