您的位置:首页 > 其它

hibernate的对象状态以及Session的不同操作对对象状态的影响

2016-07-13 16:10 405 查看
瞬时(Transient)—由new操作符创建,且尚未与HibernateSession关联的对象被认定为瞬时的;瞬时对象不会被持久到数据库中,也不会被赋予持久化标识(identfier)。如果瞬时对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。使用HibernateSession可以将其变为持久状态。(Hibernate会自动执行必要的SQL语句)

持久(Persistent)—持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identfier)。持久的实例可能是被刚保存的,或刚被加持的,无论哪种,按定义,它存在于相关的session作用范围中。Hinernate会检测到处于持久状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步。开发者不需要手动执行UPDATE。将对象从持久状态变成瞬时状态也不需要手动执行DELETE语句。

脱管(游离)(Detached)—与持久对象关联的Session被关闭后,对象就变成脱管的。对脱管对象的引用依然有效,对象可继续被修改。脱管对象如果重新关联到某个新的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的缓存中删除一个持久对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息