新手hibernate session缓存 疑问?谢谢!

  例1-

Session session = HibernateSessionFactory.getSession();
  Transaction tx = session.beginTransaction();


   tx.begin();


  StuClass sClass = new StuClass();  //new 一个StuClass对象
  sClass.setCname("bbbbbb");  
  session.save(sClass);


  tx.commit();

 

  commit()之后这个sClass对象是什么状态?


  session.close();

 close()之后这个sClass对象是什么状态? 

  如果是游离态的 那为什么我

   System.out.println(sClass.getCname());
  System.out.println(sClass.getId());之后还能取到 属性值?  还是说游离态本来就有属性值?~  是不是游离态只有一个oid和数据库的一条记录对应!!?

 

 

 

例2

  Session session = HibernateSessionFactory.getSession();
  Transaction tx = session.beginTransaction();


  tx.begin();


  StuClass sc = (StuClass) session.load(StuClass.class, new Integer(1));  //从数据库加载Id是1的 StuClass对象!  

  
  session.save(sClass);


  tx.commit();

  //这里我能取到这个sc对象的 的name 和 id 这个时候它是什么状态?
   System.out.println(sc.getCname());
  System.out.println(sc.getId());

 

  session.close();

 

//关闭session之后!!!

   System.out.println(sc.getCname());
  System.out.println(sc.getId());

如果我单纯的取ID 就能正常取到

但是如果我取name就会报异常!!

这个时候sc是什么状态?

 

 

谢谢了 !!!! 辛手!

 

 

 

 

例1:
commit()之后这个sClass对象是持久态,
session.close();后这个对象是游离态,session已经关闭,不被hibernate管理了,是一个普通的JAVA对象,当然可以取到里面的属性

例2:
tx.commit();之后是持久态,因为load默认延迟加载,sc.getCname()时会发sql去数据库查询
session.close();之后是游离态,因为session已经关闭,sc是load方法加载上来的,里面的属性并没有从数据库里面查出来,这个时候你取name时,因为session已经关闭,无法从数据库里面查询,所以报错

PS:load方法默认延时加载对象的属性(hibernate帮你用了代理),如果你不想延时加载,用get方法