下面的函数是我在Web应用程序中具有的按钮的actionListener,我正在从数据库中的表中删除旧选择的行,并将新行插入数据库中。
public void getSelectedExemptionItems(ActionEvent ae) { Session hibernateSession; Session hibernate2Session; selectedExemptions = new ArrayList<ExemptionBean>(); for (ExemptionBean eBean : exemBean) { // iterating over the list of ExemptionBean class if (selectedExemptionIDs.get(eBean.getExemptionID()).booleanValue()) { selectedExemptions.add(eBean); // adding every ExemptionBean that is selected. } } // getting importane session variables SessionBean1 theSessionBean = (SessionBean1) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("SessionBean1"); JAdmApplication admApplication = theSessionBean.getAdmApplication(); long admAppID = admApplication.getJAdmApplicationId(); // ArrayList<JAdmAppExemption> admAppExemption = (ArrayList<JAdmAppExemption>)theSessionBean.getAdmAppExemption(); JAdmAppExemption admAppExem = new JAdmAppExemption(); // try catch : delete all previously chosen exemptions from database by logged-in user. try { hibernateSession = HibernateUtil.getAdmSessionFactory().getCurrentSession(); Transaction t = hibernateSession.beginTransaction(); t.begin(); String sequel = "DELETE FROM JAdmAppExemption WHERE createdby = ?"; Query q = hibernateSession.createQuery(sequel); q.setParameter(0, theSessionBean.getPortalUserId()); } catch (Exception e){ System.out.println("Row could not be deledted from database!!"); } // adding all selected exemptions to the database for (ExemptionBean e : selectedExemptions) { admAppExem.setAdClientId(1000001); admAppExem.setAdOrgId(1000001); admAppExem.setCreated(getTimestamp()); admAppExem.setCreatedby(theSessionBean.getPortalUserId()); admAppExem.setIsactive('Y'); admAppExem.setJAdmAppExemptionId(getJAdmAppExemptionIdSequence()); admAppExem.setJAdmApplicationId(admAppID); admAppExem.setJAdmExemptionId(e.getExemptionID()); admAppExem.setUpdated(getTimestamp()); admAppExem.setUpdatedby(theSessionBean.getPortalUserId()); hibernate2Session = HibernateUtil.getAdmSessionFactory().getCurrentSession(); // session is opened here! Transaction tx = hibernate2Session.beginTransaction(); tx.begin(); try { hibernate2Session.beginTransaction(); hibernate2Session.save(admAppExem); // is it save or saveOrUpdate?? hibernate2Session.getTransaction().commit(); updateJAdmAppExemptionIdSequence(); } catch (Throwable ex){ if (hibernate2Session.getTransaction().isActive()) { hibernate2Session.getTransaction().rollback(); } ex.printStackTrace(); } } }
我一直在例外:会话关闭!有人可以解释一下如何在hibernate状态下关闭会话(自动吗?)以及如何使用它们。
这是该异常的详细堆栈跟踪:
javax.faces.FacesException: org.hibernate.SessionException: Session is closed! at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:90) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at com.icesoft.faces.webapp.http.core.JsfLifecycleExecutor.apply(JsfLifecycleExecutor.java:18) at com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.renderCycle(ReceiveSendUpdates.java:132) at com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.service(ReceiveSendUpdates.java:74) at com.icesoft.faces.webapp.http.core.RequestVerifier.service(RequestVerifier.java:31) at com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer.service(PathDispatcherServer.java:24) at com.icesoft.faces.webapp.http.servlet.BasicAdaptingServlet.service(BasicAdaptingServlet.java:16) at com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:23) at com.icesoft.faces.webapp.http.servlet.SessionDispatcher.service(SessionDispatcher.java:53) at com.icesoft.faces.webapp.http.servlet.SessionVerifier.service(SessionVerifier.java:26) at com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:23) at com.icesoft.faces.webapp.http.servlet.MainServlet.service(MainServlet.java:131) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at com.icesoft.faces.webapp.xmlhttp.BlockingServlet.service(BlockingServlet.java:56) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509) at java.lang.Thread.run(Thread.java:619) Caused by: javax.faces.el.EvaluationException: org.hibernate.SessionException: Session is closed! at com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) at javax.faces.component.UICommand.broadcast(UICommand.java:380) at com.icesoft.faces.component.panelseries.UISeries$RowEvent.broadcast(UISeries.java:617) at com.icesoft.faces.component.panelseries.UISeries.broadcast(UISeries.java:285) at com.icesoft.faces.component.paneltabset.PanelTabSet.broadcast(PanelTabSet.java:320) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:756) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) ... 27 more Caused by: org.hibernate.SessionException: Session is closed! at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49) at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1319) at sun.reflect.GeneratedMethodAccessor2480.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301) at $Proxy233.beginTransaction(Unknown Source) at univportal.AdmissionApplication.Application.getSelectedExemptionItems(Application.java:1595) 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) at org.apache.el.parser.AstValue.invoke(AstValue.java:172) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) at com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) ... 34 more
谢谢,
在Hibernate会话显然配置为基于请求的情况下,您在会话范围内的受管Bean中使用了延迟获取。
长话短说:了解Hibernate中的懒惰获取。