异常:Session is closed!

wcl130123 2015-07-04 06:01:00
初学Hibernate框架
利用tomcat6,myeclipse,Struts2,hibernate。练习一个web项目
把数据库里表里数据呈现在jsp页面上,分页查询,DAO用的是hibernate的api实现的。用到延迟加载,和OpenSessionInViewInterceptor拦截器,来控制事务。
测试时,显示第一页正常,点击下一页就出现异常。网上找了一上午也没什么头绪解决。
下面是代码

工具类
public class HibernateUtil {
private static SessionFactory sf;
private static ThreadLocal<Session> sessionLocal = new ThreadLocal<Session>();
static{
Configuration conf = new Configuration();
conf.configure("/hibernate.cfg.xml");
sf = conf.buildSessionFactory();
}
public static Session getSession(){
Session session = sessionLocal.get();
if(session==null){
session = sf.openSession();
sessionLocal.set(session);
}
//Session session = sf.getCurrentSession();
return session;
}
public static void closeSession(){
Session session = sessionLocal.get();
sessionLocal.set(null);
//Session session = sf.getCurrentSession();
if(session.isOpen()){
session.close();
}
}
DAO
public class HibernateCostDAOImpl implements CostDao{
private Session s ;
public HibernateCostDAOImpl(){
s = HibernateUtil.getSession();
}
public List<Cost> findPage(int page, int pageSize) throws DAOException {
String hql = "from Cost";
Query q = s.createQuery(hql);
int start = (page-1)*pageSize;
q.setFirstResult(start);
q.setMaxResults(pageSize);
List list = q.list();
return list;
}
}
拦截器
public class OpenSessionInViewInterceptor extends AbstractInterceptor{
public String intercept(ActionInvocation arg0) throws Exception{
Session s = HibernateUtil.getSession();
if(s.isOpen()){
System.out.println("kaikaikai");
}
Transaction tx = s.beginTransaction();
System.out.println("开启事务");
try {
arg0.invoke();
if(!tx.wasCommitted()){
tx.commit();
System.out.println("提交事务");
}
return null;
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
throw e;
}finally{
HibernateUtil.closeSession();
System.out.println("关闭事务");
}
}
}
其他配置都没有问题,不然开始测试首页不可能显示出来,只要点击下一月就报异常。
org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1621)
at dao.HibernateCostDAOImpl.findPage(HibernateCostDAOImpl.java:70)
at action.cost.CostListAction.execute(CostListAction.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)

求各位同僚帮小弟看看

...全文
225 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

679

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧