CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  框架、开源

-------- session is closed -----------

楼主dddeee(dddeee)2005-08-23 15:09:48 在 Java / 框架、开源 提问

软件环境:    
  按照《深入浅出hibernate》书中示例,使用的是有HibernateTemplate、回调的方式来进行数据库操作    
  配置文件:    
  这是外层的方法,用于注册新用户:    
  java代码:      
   
  public   boolean   register(final   MmsMember   member)   {    
                                  return   ((Boolean)new   HibernateTemplate().run(new   HibernateCallback()   {    
                                                  public   Object   execute()   throws   HibernateException   {    
                                                                  MmsMemberDAO   memberDao   =   MmsMemberDAO.getInstance();    
                                                                   
                                                                  //   要先判断用户名是否相同    
                                                                  String   username   =   member.getUsername();    
                                                                  MmsMember   m   =   getByName(username);    
                                                                  if(m==null)   {    
                                                                                  //   没有相同的会员    
                                                                                  memberDao.save(member);    
                                                                                  return   Boolean.TRUE;    
                                                                  }   else   {    
                                                                                  return   Boolean.FALSE;    
                                                                  }    
                                                  }    
                                  })).booleanValue();    
                  }    
   
     
   
   
  里面用于判断用户名是否已经被使用时,用了另一个函数getByName,下面是代码:    
  java代码:      
   
   
   
                  public   MmsMember   getByName(final   String   username)   {    
                                  return   (MmsMember)new   HibernateTemplate().run(new   HibernateCallback()   {    
                                                  public   Object   execute()   throws   HibernateException   {    
                                                                  MmsMemberDAO   memberDao   =   MmsMemberDAO.getInstance();    
                                                                  String   hql   =   "from   MmsMember   where   username=?";    
                                                                  Object[]   object   =   new   Object[]{username};    
                                                                  Type[]   type   =   new   Type[]{Hibernate.STRING};    
                                                                  List   list   =   memberDao.find(hql,object,type);    
                                                                  if(list.size()>0)   {    
                                                                                  return   (MmsMember)list.get(0);    
                                                                  }   else   {    
                                                                                  return   null;    
                                                                  }    
                                                  }    
                                  });    
                  }    
   
     
   
   
  其中HibernateTemplate如下:    
  java代码:      
   
   
  public   class   HibernateTemplate   {    
                  public   Object   run(HibernateCallback   callback)   {    
                                   
                                  Session   session   =   null;    
                                  Transaction   tx   =   null;    
                                  try   {    
                                                  session=   RootDAO.createSession();    
                                                  tx   =   session.beginTransaction();    
                                                  Object   result   =   callback.execute();    
                                                  tx.commit();    
                                                  session.flush();    
                                                  return   result;                                                  
                                  }   catch(HibernateException   e)   {    
                                                  try   {    
                                                                  tx.rollback();    
                                                  }catch(Throwable   t)   {    
                                                                   
                                                  }    
                                                  throw   new   RuntimeException(e);    
                                  }   finally{    
                                                  try   {    
                                                                  RootDAO.getInstance().closeSession();    
                                                  }catch(HibernateException   e)   {    
                                                                  throw   new   RuntimeException(e);    
                                                  }    
                                  }    
                  }    
  }    
   
     
   
   
  那个HibernateCallback是个接口,很简单,如下:   java代码:      
   
   
  public   interface   HibernateCallback   {    
   
                  Object   execute()   throws   HibernateException;    
  }    
   
     
   
  错误提示信息:    
  如果在一个使用了回调的方法中调用了另一个使用回调的函数,就会出现session   is   closed错误。    
  你的分析:    
  如果register函数中没有调用getByName()时,一切正常,调用后getByName时,getByName正常取得结果,但是register执行剩下的代码时,就会出现session   is   closed异常。    
   
  所以我想,原因是register与getByName方法取得的session是同一个(LocalSession),但是在getByName中把它关了,而register不知道,继续使用session,所以出错。    
   
  但是我不知道怎么改进,因为它们关闭session时,是在HibernateTemplate中关闭的。对于这种情况,我在书上没有找到相关的例子,请各位朋友指点一下! 问题点数:50、回复次数:2Top

1 楼mxlmwl(飞星)回复于 2005-08-25 14:31:24 得分 50

加上事务处理,可参考spring的实现。spring也是利用回调函数的,同时可以参考hibernate官方文档,里面有这方面的介绍。Top

2 楼mxlmwl(飞星)回复于 2005-08-25 14:32:02 得分 0

说的简单点就是如何保持session,看了我说的那些你就知道了。Top

相关问题

  • session?????????
  • Session
  • Hibername延迟检索问题?lazy ,Could not initialize proxy the owning session was closed
  • Session(Password_1)
  • cookey and session
  • Miscellance Session
  • application and session
  • session_restart
  • 关于SESSION和SESSION BEAN
  • Session_OnStart() ,Session_OnEnd()的用法

关键词

  • 函数
  • 代码
  • 用户
  • getbyname
  • mmsmember
  • memberdao
  • mmsmemberdao
  • hibernatetemplate
  • register
  • session

得分解答快速导航

  • 帖主:dddeee
  • mxlmwl

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo