2013-12-14 5 views
0

У меня есть база данных купонов, и с помощью Hibernate я пытаюсь получить 5 строк.Hibernate `Session is closed` исключение, даже сессия не закрыта

Это код:

public List<Coupon> getPage(int pageNum, boolean isActive) { 
    session = factory.openSession(); 
    session.beginTransaction(); 
    Query query; 
    if(isActive) { 
     query = session.createQuery("from Coupon where (NOW() < fadeoutDate)"); 
    } else { 
     query = session.createQuery("from Coupon"); 
    } 
    query.setFirstResult((pageNum - 1) * numCouponsPerPage); 
    query.setMaxResults(numCouponsPerPage); 
    List<Coupon> page = (List<Coupon>) query.list(); 
    closeSession(); 
    return page; 
} 

(numCouponsPerPage является константой, равной 5)

При попытке получить страницу:

List<Coupon> p = cm.getPage(dpage,active.equalsIgnoreCase("true")); (dpage = 1, второе возвращение параметра false),

Я получаю эту ошибку:

Dec 14, 2013 4:11:06 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [jsp] in context with path [/firstXDw] threw exception [An exception occurred processing JSP page /views/system/loadPage.jsp at line 30 

27:  
28:  if (whatToLoad.equalsIgnoreCase("coupons")) { 
29: 
30:   List<Coupon> p = cm.getPage(dpage,active.equalsIgnoreCase("true")); 
31:   for (Coupon c : p) { 
32:    out.println("<tr>"); 
33:    out.println("<td>" + c.getId() + "</td>"); 


Stacktrace:] with root cause 
org.hibernate.SessionException: Session is closed! 
    at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72) 
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1768) 
    at implementations.Coupons.getPage(Coupons.java:130) 
    at org.apache.jsp.views.system.loadPage_jsp._jspService(loadPage_jsp.java:82) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Почему исключение Session is closed брошено? Я открываю сеанс в первой строке функции.

В чем проблема и как ее решить?

+0

Что такое 'factory'? –

+0

@SotiriosDelimanolis 'private static SessionFactory sessionFactory = AnnotationConfiguration(). Configure(). BuildSessionFactory();' – Billie

+0

http://stackoverflow.com/a/13492564/240078 – Vikdor

ответ

0

Вы храните session в полевых условиях?

class DAO { 
    private Session session; 
    public List<Coupon> getPage(int pageNum, boolean isActive) { 
     session = factory.openSession(); 
     ... 
    } 
} 

Если это верно, то другой поток из servlet может закрыть session, потому что метод getPage не поточно-. Вы shold использовать локальные переменные из Session и изменить метод подписи closeSession:

class DAO { 
    //private Session session; 
    public List<Coupon> getPage(int pageNum, boolean isActive) { 
     Session session = null; 
     try { 
      session = factory.openSession(); 
      ... 
      return result; 
     } catch (Exception e) { 
     //log exception 
     } finally { 
      closeSession(session); 
     } 
    } 
} 
Смежные вопросы