hibernate框架(3)---持久化对象
2017-03-01 21:09
218 查看
[b]持久化对象[/b]
再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别:
简单总结:
(1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。
在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常。
由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
(2)get不支持lazy,load支持lazy
lazy表示只有在用到的时候才加载数据,
如:Student student =
(Student)session.load(Student.class,1); //不会发出SQL语句
student.getName(); //这条语句才会发出SQL语句
而使用get方法,Student
student = (Student)session.get(Student.class,1); //会发出SQL语句
理解OID
用来持久化数据的唯一标识,在小配置里边的id标签中存在
Hibernate的持久化类状态
持久化类:就是一个实体类 与 数据库表建立了映射.
Hibernate为了方便管理持久化类,将持久化类分成了三种状态.
瞬时态 transient (临时态):持久化对象没有唯一标识OID.没有纳入Session的管理
持久态 persistent :持久化对象有唯一标识OID.已经纳入到Session的管理(持久化持久态对象有自动更新数据库的能力)
脱管态 detached (离线态):持久化对象有唯一标识OID,没有纳入到Session管理
区分三种持久化对象的状态
三种状态对象转换
瞬时态
获得:[b]Book book = new Book();[/b]
瞬时--->持久:[b]save(book) ([b]save()/saveOrUpdate())[/b][/b]
瞬时--->脱管:[b]book.setId(1);[/b]
持久态
获得:[b]Book book = (Book)session.get(Book.class,1) ([b]get()/load()/find()/iterate())[/b][/b]
持久--->瞬时:[b]delete(book) ([b]特殊状态:删除态(被删除的对象,不建议去使用))[/b][/b]
持久--->脱管:[b]session.close() (close()/clear()/evict())[/b]
脱管态
获得: [b]Book book = new Book();[/b]
book.setId(1);
脱管--->持久:[b]session.update() (update()/saveOrUpdate()/lock())[/b]
脱管--->瞬时:[b]book.setId(null)[/b]
[b]持久态对象有自动更新数据库的能力([b]自动更新数据库的能力依赖了Hibernate的一级缓存)[/b][/b]
先说明下,本文主要是参考博客名为:凌晨三点文章,非常感谢提供这么好的文章!
再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别:
简单总结:
(1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。
在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常。
由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
(2)get不支持lazy,load支持lazy
lazy表示只有在用到的时候才加载数据,
如:Student student =
(Student)session.load(Student.class,1); //不会发出SQL语句
student.getName(); //这条语句才会发出SQL语句
而使用get方法,Student
student = (Student)session.get(Student.class,1); //会发出SQL语句
理解OID
用来持久化数据的唯一标识,在小配置里边的id标签中存在
Hibernate的持久化类状态
持久化类:就是一个实体类 与 数据库表建立了映射.
Hibernate为了方便管理持久化类,将持久化类分成了三种状态.
瞬时态 transient (临时态):持久化对象没有唯一标识OID.没有纳入Session的管理
持久态 persistent :持久化对象有唯一标识OID.已经纳入到Session的管理(持久化持久态对象有自动更新数据库的能力)
脱管态 detached (离线态):持久化对象有唯一标识OID,没有纳入到Session管理
区分三种持久化对象的状态
// 区分持久化对象的三种状态: public void demo1(){ // 1.创建Session Session session = HibernateUtils.openSession(); // 2.开启事务 Transaction tx = session.beginTransaction(); // 向数据库中保存一本图书: Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与session关联. book.setName("Hiernate开发"); book.setAuthor("孙XX"); book.setPrice(65d); session.save(book); // 持久态:有唯一标识OID,与session关联. // 3.事务提交 tx.commit(); // 4.释放资源 session.close(); book.setName("Struts2开发"); // 脱管态:有唯一的标识,没有与session关联. }
三种状态对象转换
瞬时态
获得:[b]Book book = new Book();[/b]
瞬时--->持久:[b]save(book) ([b]save()/saveOrUpdate())[/b][/b]
瞬时--->脱管:[b]book.setId(1);[/b]
持久态
获得:[b]Book book = (Book)session.get(Book.class,1) ([b]get()/load()/find()/iterate())[/b][/b]
持久--->瞬时:[b]delete(book) ([b]特殊状态:删除态(被删除的对象,不建议去使用))[/b][/b]
持久--->脱管:[b]session.close() (close()/clear()/evict())[/b]
脱管态
获得: [b]Book book = new Book();[/b]
book.setId(1);
脱管--->持久:[b]session.update() (update()/saveOrUpdate()/lock())[/b]
脱管--->瞬时:[b]book.setId(null)[/b]
[b]持久态对象有自动更新数据库的能力([b]自动更新数据库的能力依赖了Hibernate的一级缓存)[/b][/b]
// 测试持久态的对象自动更新数据库 public void demo2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); // 获得一个持久态的对象. Book book = (Book) session.get(Book.class, 1); book.setName("Struts2开发"); // session.update(book);//不需要写这句话,在事务提交后即可完成更新 tx.commit(); session.close(); }
先说明下,本文主要是参考博客名为:凌晨三点文章,非常感谢提供这么好的文章!
相关文章推荐
- (转) Hibernate框架基础——操纵持久化对象的方法(Session中)
- Hibernate框架学习之二:深入理解持久化对象
- Hibernate对象持久化框架
- 【Hibernate框架学习】:Hibernate进阶之持久化对象状态
- Hibernate对象持久化框架
- 【Hibernate框架】对象的三种持久化状态
- Hibernate框架学习(第四讲)---持久化对象状态
- Hibernate框架基础——操纵持久化对象的方法(Session中)
- 当前最流行的对象持久化技术: hibernate框架介绍及示例
- 【Hibernate框架】对象的三种持久化状态
- hibernate持久化对象状态
- Hibernate的学习之路十(持久化对象的三个状态)
- Hibernate的学习之路十(持久化对象的三个状态)
- 第5章Hibernate的基本的用法5.5深入理解持久化对象
- 【Hibernate】——持久化对象的三种状态
- Hibernate持久化对象的状态
- 中国人应不应当自己开发对象持久化框架?(转载)
- Java对象持久化技术Hibernate入门
- Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征