1、HIBERNATE 中持久化类实例的三种状态
1.1 临时状态
特征:
a.不存在于session实例的缓存中,不与任何session实例相关联
b.在数据库中没有民之相对应的记录
促使持久化类实例进入临时状态的情况如下:
a.通过new语句创建新的持久化类实例。
b.通过执行delete()方法删除持久化类实例。
1.2 持久化状态
特征:
a.存在于session实例的缓存中,与session实例相关联。
b.在数据库中有与这相对应的记录。
c.session实例在清理缓存时会根据持久化类实例属性的变化更新数据库。
促使持久化类实例进入持久化状态的情况如下:
a.通过执行save()或saveOrUpdate()方法使临时对象转变为持久化对象。
b.通过执行update()或saveOrUdate()方法使游离对象转变为持久化对象。
c.通过执行load()或get()方法返回的持久化实例都是持久化类对象。
d.通过执行find()方法返回的list集合中的持久化实例都是持久化类对象。
e.在允许级联保存的情况下,session实例在清理缓存时会把与持久化对象关联的临时对象转变为持久化对象。
1.3 游离状态
特征:
a.不存在于session实例的缓存中,不与任何session实例相关联
b.在数据库中有与之相对应的记录(前提条件是没有其他session实例删除该记录).
促使持久化类实例进入临时状态的情况如下:
a.通过执行evict()方法,可以从session实例的缓存中删除一个持久化类实例,使之转变为游离对象。
b.通过执行clear()方法,可以清空session实例的缓存,使缓存中的所有持久化类实例转变为游离状态
c.通过执行close()方法,可以销毁session实例,从而清空session实例的缓存。
2、三种状态之间的转换
代码 | 对象的生命周期状态 | 对象的状态 |
Users users=new Users(); | 开始生命周期 | 开始生命周期 |
Session session=sessionFactory.openSessin(); Transaction tx=session.beginTransaction(); | 在生命周期中 | 临时状态 |
Session.save(users); | 在生命周期中 | 转变为持久化状态 |
Tx.commit(); | 在生命周期中 | 持久化状态 |
Session.close(); | 在生命周期中 | 转变为游离状态 |
System.out.println(users.getName()); | 在生命周期中 | 游离状态 |
Users=null; | 结束生命周期 | 结束生命周期 |
save()方法:
* 1.应尽量在调用save()方法之前完成对持久化类实例的修改,如果已经通过save方法对持久化类实例进行了持久化 操作,再修改持久化类实例,在提交事务时将多执行一条update语句,影响运行速度。
* 2.坚决避免重持久化同一持久化类实例。
Update()方法:
*1.当通过update方法将游离对象转变为持久化对象之后,并对持久化对象做了修改,在这种情况下并不需要调用save或update方法
*2.如果在一次事务中对持久化对象做了多次修改,hibernate同样只生成一条update语句。
*3.通过update方法将一个持久化类实例从游离状态转变为了持久化状态,但并未对该持久化对象做任何修改,在默认情况下,同样会在关闭session实例时执行一条update语句,、
*可以通过修改配置文件将:select-befor-update属性设为true,默认为false,当设为true时,会在执行update语句之前执行一条select语句,判断持久化对象与数据库
* 当中的记录是否一致如果一致则不执行update,否则执行,
*建议:对于很少发生改变的持久化类可以采用这种配置,因为执行select语句的效率要比执行update语句的效率高,对于常发生改变的类,建议不要采用这种配置,那样每次都会多执行一条语句。
delect()方法
*1.通过此方法可以删除持久化类实例(可以是持久化对象,也可以是游离状态)
* 2.批量删除时可用如下代码:
Query query=session.createQuery("delete from Users");
query.executeUpdate();//只执行一条删除语句
get()方法
1.当通过此方法加载指定的持久化实例时,如果在数据库中存在相应的记录,则返回持久化类实例,不存在则返回null
2.当存在的时候总是立即返回,即使是在映射文件中设置该类采用延迟检索策略
3.当通过此方法加载指定的持久化类实例时,hibernate首先会检索当前session实例的缓存,如果存在,则直接返回该持久化类实例的引用,否则继续检索二级缓存(前提条件是引入了二级缓存),最后在缓存中检索不到的情况下才执行select语句,从数据库检索。
4.通过此方法加载得到的持久化类实例便位于session实例的缓存中,也可以理解为通过此方法可以将指定的持久化了的实例加载到当前session实例的缓存中,在这种情况下,如果对持久化类实例做了修改,并不需要执行save方法修改。