-------- session is closed -----------
软件环境:
按照《深入浅出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




