Hibernate的持久化类状态

Hibernate的持久化类状态
  持久化类:就是一个实体类 与 数据库表建立了映射.
  Hibernate为了方便管理持久化类,将持久化类分成了三种状态.
    瞬时态 transient (临时态):持久化对象没有唯一标识OID.没有纳入Session的管理
    持久态 persistent :持久化对象有唯一标识OID.已经纳入到Session的管理(持久化持久态对象有自动更新数据库的能力)
    脱管态 detached (离线态):持久化对象有唯一标识OID,没有纳入到Session管理

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

@Test
// 区分持久化对象的三种状态:
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关联.
}

 

三种状态对象转换
  瞬时态
    获得: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的一级缓存)

@Test
// 测试持久态的对象自动更新数据库
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();
}

 

posted @ 2016-12-13 13:46  凌晨。。。三点  阅读(210)  评论(0编辑  收藏  举报