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 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体