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的缓存中删除一个持久对象。
持久(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的缓存中删除一个持久对象。
相关文章推荐
- Angularjs 跨域请求
- kindeditor 批量上传 上传失败 thinkphp swfupload session
- 杰奇登录后的东西都是在session里面的
- ASP中SESSION无法保存问题的解决办法
- Oracle中的Connect/session和process的区别及关系介绍
- Node.js编程中客户端Session的使用详解
- 完美解决ajax访问遇到Session失效的问题
- 浅谈COOKIE和SESSION区别
- 解析PHP的session过期设置
- php中Session的生成机制、回收机制和存储机制探究
- php中将一个对象保存到Session中的方法
- 深入解析Session是否必须依赖Cookie
- 对比分析php中Cookie与Session的异同
- PHP Session机制简介及用法
- 新手菜鸟必读:session与cookie的区别
- 深入讲解PHP Session及如何保持其不过期的方法
- PHP Session变量不能传送到下一页的解决方法
- PHP中的session永不过期的解决思路及实现方法分享
- php session实现多级目录存放实现代码