Hibernate对象的三种状态
瞬时的(Transient)
由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时的(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。如果瞬时对象在程序中没有被引用,它会被Java垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态(Hibernate会自动执行必要的SQL语句)。
持久的(Persistent)
一个持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session的作用范围内。Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元执行完毕时将对象的状态同步到数据库,开发者不需要手动执行UPDATE语句。同样的,将一个对象变为瞬时(Transient)状态,也不需要手动执行DELETE语句。
分离的(又叫托管的)(Detached)
与持久对象关联的Session被关闭后,对象就变为分离的(Detached)的。 对分离对象的引用仍然是有效的,对象可以继续被修改。分离对象如果重新关联到某个新的Session上, 会再次转变为持久的(在Detached其间的改动将被持久化到数据库中)。
Session session=factory.openSession();
User user=new User();
//user对象处于瞬时状态。
user.setName("张三");
user.setAge(18);
Transaction tran=Session.beginTransaction();
session.save(user);
//user对象处于持久状态。
tran.commit();
session.close();
//user对象处于分离状态。
user.setName("李四");
Session session2=factory.openSession();
Transaction tran2=Session2.beginTransaction();
Session2.update(user);
//user对象处于持久状态。
tran2.commit(); (分离状态中对象的变动在再次持久时回被持久化到数据库)
Transaction tran3=Session.beginTransaction();
Session2.delete(user);
//user对象处于瞬时状态。
tran3.commit();
session2.close();
Session的不同操作对对象状态的影响
Session的save()方法
save()方法将一个瞬时对象转变为持久对象。
Session的update()方法
update()方法将一个分离对象转变为持久对象。
Session的lock()方法
调用lock()方法将对象同Session相关联而不强制更新。
Session的merge()方法
拷贝指定对象的状态到具有相同对象标识符的持久对象。
Session的saveOrUpdate()方法
saveOrUpdate()方法对于瞬时对象,执行save()方法,对于分离对象,执行update()方法。
Session的load()和get()方法
load()方法和get()方法都可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。
Session的delete()方法
delete()方法用于从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条delete语句。如果传入的参数是分离对象,先使分离对象与Session关联,使它变为持久化对象,然后才计划执行一个delete语句。
Session的evict()方法
evict()方法从Session的缓存中删除一个持久对象。
Hibernate 对象状态的理解
最新推荐文章于 2024-08-12 17:02:49 发布