持久化对象
再讲持久化对象之前,我们先来理解有关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管理
区分三种持久化对象的状态
1 // 区分持久化对象的三种状态: 2 public void demo1(){ 3 // 1.创建Session 4 Session session = HibernateUtils.openSession(); 5 // 2.开启事务 6 Transaction tx = session.beginTransaction(); 7 // 向数据库中保存一本图书: 8 Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与session关联. 9 book.setName("Hiernate开发"); 10 book.setAuthor("孙XX"); 11 book.setPrice(65d); 12 session.save(book); // 持久态:有唯一标识OID,与session关联. 13 // 3.事务提交 14 tx.commit(); 15 // 4.释放资源 16 session.close(); 17 book.setName("Struts2开发"); // 脱管态:有唯一的标识,没有与session关联. 18 }
三种状态对象转换
瞬时态
获得:Book book = new Book();
瞬时--->持久:save(book) (save()/saveOrUpdate())
瞬时--->脱管:book.setId(1);
持久态
获得:Book book = (Book)session.get(Book.class,1) (get()/load()/find()/iterate())
持久--->瞬时:delete(book) (特殊状态:删除态(被删除的对象,不建议去使用))
持久--->脱管:session.close() (close()/clear()/evict())
脱管态
获得: Book book = new Book();
book.setId(1);
脱管--->持久:session.update() (update()/saveOrUpdate()/lock())
脱管--->瞬时:book.setId(null)
持久态对象有自动更新数据库的能力(自动更新数据库的能力依赖了Hibernate的一级缓存)
1 // 测试持久态的对象自动更新数据库 2 public void demo2(){ 3 Session session = HibernateUtils.openSession(); 4 Transaction tx = session.beginTransaction(); 5 // 获得一个持久态的对象. 6 Book book = (Book) session.get(Book.class, 1); 7 book.setName("Struts2开发"); 8 // session.update(book);//不需要写这句话,在事务提交后即可完成更新 9 tx.commit(); 10 session.close(); 11 }
先说明下,本文主要是参考博客名为:凌晨三点文章,非常感谢提供这么好的文章!