iteye_19738 2010-01-27 16:25
浏览 185
已采纳

新手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条回答 默认 最新

  • yonglin4605 2010-01-27 17:50
    关注

    例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方法

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭