Session Hibernate fermé de problème!
La fonction ci-dessous est la actionListener pour un bouton que j'ai dans mon application web, je suis à la suppression de l'ancienne choisi les lignes d'une table dans une base de données et de l'insertion de la de nouveaux à la base de données.
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();
}
}
}
Je reçois une exception : la fermeture de la Session !! quelqu'un peut-il expliquer la façon dont les sessions sont fermées en veille prolongée (automatiquement?) et comment travailler avec eux..
voici la description détaillée trace de la pile de l'exception:
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
Merci,
OriginalL'auteur Saher Ahwal | 2010-06-29
Vous devez vous connecter pour publier un commentaire.
Vous utilisez le chargement différé dans une session d'étendue de managed bean alors que la session Hibernate est apparemment configuré à la demande en fonction.
Longue histoire courte: La compréhension de chargement différé en veille prolongée.
OriginalL'auteur BalusC
Ici est une forme concise, la réponse que j'ai trouvé à cette question ici si quelqu'un rencontre ce problème de mise en veille prolongée. Apparemment, c'est simple!
géré à l'aide de sessions hibernate pour faciliter les tests unitaires 06nov06
Si vous avez déjà essayé de réutiliser une session en mode veille prolongée, vous pouvez avoir rencontré cette exception...
La raison pour cela est que Hibernate utilise
thread
géré sessions. Avec ce type de gestion de session Hibernate gère la session pour vous. Lorsque vous essayez d'utiliser une session Hibernate va en créer une et de la joindre à votre fil local. Lorsque vous validez la transaction dans la session Hibernate ferme automatiquement la session sens qu'il ne peut pas être réutilisée.Pour contourner ce problème, la meilleure option est d'utiliser
managed
sessions. Avec la gestion des sessions que vous êtes en plein contrôle de la création, bouffées de chaleur, la validation, et la clôture des séances. Voici comment.Dans votre
hibernate.cfg.xml
modifier la propriétécurrent_session_context_class
àmanaged
.Pour créer un
session
et de commencer unetransaction
dans cesession
faire...À
commit
untransaction
dans lesession
faire...Pour utiliser ce code dans les tests unitaires j'ai créé cette unité de base de la classe de test que tous mes tests unitaires étendre. Chaque fois que je veux créer un nouveau
session
outransaction
j'appelle la méthodecreateNewSessionAndTransaction()
. Pour engager la session de l'opération j'ai appeler la méthodecommitTransaction()
.OriginalL'auteur Saher Ahwal
Essayez d'ajouter ceci à votre méthode de contrôleur:
OriginalL'auteur ACV