瞬时状态(Transient):如果Java对象与数据库中的数据没有任何的关联,即此Java对象在数据库中没有任何相关记录,此时Java对象的状态是瞬时状态。相当于公司中没有入职的实习生,在公司中并没有任何备案和工号。Java对象就是实习生,Session就是公司。
持久状态(Persistent):当对象与Session关联,被Seesion管理时,他就处于持久状态。处于持久状态的对象拥有数据库标识。相当于公司中入职的员工,有唯一的工号,被公司统一管理。Seesion会持续跟踪和管理他们,如果对象的内部状态发生改变,Session就会将他们状态的变更同步到数据库。
游离状态(Detached):处于持久状态的对象,脱离与其关联的Session管理后,就处于游离状态。处于游离状态的对象,Session无法保证对象所包含的数据于数据库中的记录是否一致没所以Session无法感知该对象的任何操作。相当于公司中出差的员工,他们在公司有唯一的员工编号,但是他们的任何行为和状态公司是无法确定的,或许他可能已经去了其他公司上班或者是不回公司。所以公司会发送一些信息去观察该对象使得该对象还是归该公司管理(如汇到自身信息)。即Session提供update(),saveOrUpdate()方法使游离的对象的数据以更新的方式同步到数据库,并将该对象与当前的Session关联。
Hibernate API转换对象状态
瞬时状态转为持久状态(相当于实习生转正为正式员工)
1.get()
2.load()
3.save()
4.saveOrUpdate()
5.merge()持久状态转为瞬时状态(相当于正式员工离职)
delete()持久状态转为游离状态(相当于正式员工出差)
1.clear()
2.evict()
3.close()游离状态转为持久状态(相当于出差员工回到公司考勤)
1.update()
2.saveOrUpdate()
3.merge()游离状态转为瞬时状态(相当于出差的员工半途跳槽另一家公司工作)
delete()
/**
* 测试持久化对象的生命周期
*/
public void lifeState(Serializable id) {
Transaction tx = null;
Department department = null;
try {
tx = departmentDao.getCurrentSession().beginTransaction();
department = departmentDao.load(id);
System.out.println(department + "处于持久化状态");
/*department.setLocation("上海");
System.out.println(department+"处于持久化状态");*/
departmentDao.delete(department);
System.out.println(department + "处于瞬时状态");
tx.commit();
// System.out.println(department+"处于游离状态");
} catch (HibernateException ex) {
ex.printStackTrace();
if (tx != null) {
tx.rollback();
}
}
}