4.1 Session方法核心
持久化对象的状态
站在持久化的角度,Hibernate把对象分为4种状态:持久化状态(比作公司的职员),临时状态(比作公司未正式入职的职员),游离状态(比作公司请假的职员),删除状态(比作公式开除的职员)。
Session的特定方法能使对象从一个状态转换到另一个状态。
2.持久化对象(也叫“托管”)(Persist):
3.删除对象(Removed):

站在持久化的角度,Hibernate把对象分为4种状态:持久化状态(比作公司的职员),临时状态(比作公司未正式入职的职员),游离状态(比作公司请假的职员),删除状态(比作公式开除的职员)。
Session的特定方法能使对象从一个状态转换到另一个状态。
- 在使用代理主键的情况下,OID通常为null
- 不处于Session的缓存中
- 在数据库中没有对应的记录
2.持久化对象(也叫“托管”)(Persist):
- OID不为null
- 位于Session缓存中
- 若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
- 在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象
3.删除对象(Removed):
- 在数据库中没有和其OID对应的记录
- 不再处于Session缓存中
- 一般情况下,应用程序不该再使用被删除的对象
4.游离对象(也叫“托管”)(Detached):
- OID不为null
- 不再处于Session缓存中
- 一般情况下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在于它对应的记录
Session的update()方法:
- Session的update()方法使一个游离对象转变为持久化对象,并且计划执行一条update语句。
- 若希望session仅当修改了News对象的属性时,才执行update()语句,可以把映射文件中<class>元素的select-before-update设为true,该属性的默认值为false。(一般不使用,只有在和出发协同工作时才会设置,以防出现问题)
- 当update()方法关联一个游离对象时,如果在Session的缓存中已经存在相同OID的持久化对象,会抛出异常
- 当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常
Session的saveOrUpdate()方法:
1.Session的saveOrUpdate()方法同时包含了save()与update()的功能
1.Session的saveOrUpdate()方法同时包含了save()与update()的功能
- News对象如果是游离对象,则执行update()方法;如果是临时对象,则执行save()方法。
- Java对象的OID为null
- 映射文件中<id>设置了 unsaved-value属性,并且Java对象的OID取值与这个unsave-value属性值匹配
Session的merge()方法:
Session的delete()方法:
1.Session的delete()方法既可以删除一个游离对象,也可以删除一个持久化对象
2.Session的delete()方法处理过程
- 计划执行一条delete语句
- 把对象从Session缓存中删除,该对象进入删除状态
通过Hibernate调用存储过程
1.Work接口:直接通过JDBC API来访问数据库的操作
public interface Work{
public void execute(Connection connection) throw SQLException;
}
2.Session的doWork(Work)方法用于执行Work对象指定的操作,即调用Work对象的excute()方法,Session会把当前使用的数据库连接传递给execute()方法
public void testDoWork() {
session.doWork(new Work() {
@Override
public void execute(Connection arg0) throws SQLException {
System.out.println(arg0);
//调用存储过程
}
});
public interface Work{
public void execute(Connection connection) throw SQLException;
}
2.Session的doWork(Work)方法用于执行Work对象指定的操作,即调用Work对象的excute()方法,Session会把当前使用的数据库连接传递给execute()方法
public void testDoWork() {
session.doWork(new Work() {
@Override
public void execute(Connection arg0) throws SQLException {
System.out.println(arg0);
//调用存储过程
}
});
Hibernate与触发器协同工作
Hibernate与数据库中的触发器协同工作时,会造成两类问题:
- 触发器使Session的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中,它执行的操作对Session是透明的
- Session的update()方法盲目地激发触发器:无论游离对象的属性是否发生变化,都会执行update语句,而update语句会激发数据库中相应的触发器
- 在执行完Session的相关操作后,立即调用Session的flush()和refresh()方法,迫使Session的缓存与数据库同步()refresh()方法重新从数据库中加载对象)
- 在映射文件的<class>元素中设置select-before-update属性:当Session的update或saveOrUpdate()方法更新一个游离对象时,会先执行Select语句,获得当前游离对象在数据库中的最新数据,只有在不一致的情况下才会执行update语句。