service代码://方法上有配置了事务
public Tree createDirectoryTree(long rootDirectoryId) throws ServiceException {
Directory rootDirectory = (Directory)getBaseDAO().load(getDirectoryClass(), rootDirectoryId);
System.out.println(rootDirectory.getName());//这里报no session错误
...

DAO代码:public BasePojo load(Class<? extends BasePojo> clazz, long id) throws DataAccessException {
try {
return hibernateTemplate.load(clazz, id);
} catch(Exception e) {
throw new DataAccessException(e.getMessage());
} finally {
hibernateTemplate.clear();//去掉这一句,就没有报no session错误
}
}createDirectoryTree的事务还没结束,session应该是还没关闭的啊
而且上面DAO注释掉hibernateTemplate.clear(),就不会有no session错误,我找不到原因,各位帮帮忙指导下我什么原因

解决方案 »

  1.   

    hibernateTemplate.clear() 是用来干什么的?你想清空一级缓存么?hibernateTemplate.load(clazz, id)是lazy加载啊。你要查找的对象这时候还不在缓存里吧。
      

  2.   

    我在BaseDAO里的每个方法结束时,都有清除缓存,防止系统运行长时间后,缓存太多,影响性能。
    昨天,我查了hibernate的缓冲机制的资料,心里有了个模模糊糊的概念,但是还是理不清楚,帮忙讲下原因。
    我把load改为get,就不会出错,我知道load是懒加载,get是立即加载,我在load之后,清除缓存,这个时候缓冲里面找不到对象,但是session还没关,不是还可以再加载吗?
    还有就是get不也是加载到缓存里面吗,那clear之后为什么还能使用?
      

  3.   

    hibernateTemplate.clear()这个方法已经清空一级缓存的数据,并且session也关闭了,数据就没有了,你在业务逻辑再拿这些数据时,数据不存在session中了,那系统就会报session is closed 这个错误,如果你也用到spring框架,你家把关闭session的事情给spring管理就行了,不需要在DAO,出来关闭session的操作了。
      

  4.   

    我就是有集成spring框架,DAO里面没有关闭,代码就是贴出来的那样,那里面没有close。
    能不能告诉我spring中hibernate的session周期,是不是从事务开始,到事务结束时关闭。
      

  5.   

    又是这种麻烦问题。你用OpenSessionInView了吧?
      

  6.   

    没有用OpenSessionInView,而且这数据都还没传到jsp页面,是在服务端出现的错误,就是service调用DAO的load之后(DAO的load之后有clear),马上使用这个数据,这个时候报的错误,不管有没有用OpenSessionInView都没关系吧
      

  7.   

    hibernateTemplate 提供了find 和get方法 一般不用loadhibernateTemplate 已经接管了hibernate的session 不需要你去管理
      

  8.   

    我在我的机器上做了实验,无论get还是load都没有问题。看来还是的请你自己解决啦。 好好看看配置吧。
      

  9.   

    要不你别用hibernateTemplate试一试, 这个东西反正我是不习惯。 直接把 session factory 注入到 dao impl
      

  10.   


    那这样的话,每个方法是不是都是用sessionFactory.getCurrentSession()来获取session,然后操作数据库,晚上回去试下,真悲剧
      

  11.   

    想这样要根据id加载对象时,你平常都是用get吗
      

  12.   

    在spring中,session的生命周期是不是从事务开始,到事务结束
      

  13.   

    我试了用session还是不行,配置应该是没错的,我精简到最简单的,如果这配置还有错的话,那以前做的一个系统应该也会报错的(以前那系统load之后没有clear)。
      

  14.   

    我猜,是因为我clear之后,当我要获取rootDirectory的信息时,hibernate判断出之前加载的状态已经是游离状态了,所以报no session,而如果我用get,所以的属性都已经加载出来了,就不需要再让hibernate去加载属性,当然hibernate也就不会报no session错了。
    不知道我想的是不是正确的,有没有人指导下,明天结账。