您的位置:首页 > 其它

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管理

区分三种持久化对象的状态

// 区分持久化对象的三种状态:
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();
}


先说明下,本文主要是参考博客名为:凌晨三点文章,非常感谢提供这么好的文章!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: