These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 9 posts ] 
Author Message
 Post subject: HibernateUtil et session is closed
PostPosted: Thu Jun 22, 2006 5:32 am 
Newbie

Joined: Thu May 11, 2006 5:35 am
Posts: 15
Location: clermont ferrand - France
Bonjour,
J'utilise Hibernate 3.1.3 avec une base postgreSQL 8.1

Je rencontre un problème facheux que je n'arrive absoluement pas à résoudre : Peut importe l'accès que je veux faire à ma base de données, je me retrouve avec une exception session is closed. Le problème est que j'éxécute seulement des requètes simples sur la base. Pourtant, j'utilise HibernateUtil et mes methode sont les plus simple qu'il soit :

Code:
Session s = HibernateUtil.currentSession();
      Transaction tx = s.beginTransaction();
      
      User us = (User) s.get(User.class,idUser);
      
      tx.commit();
      HibernateUtil.closeSession();
      return us;      


Le session is closed se produit sur le get alors que avec un debugger, juste avant ma variable session est bien ouverte ...

et voila le type d'exception retourné :
Code:
org.hibernate.SessionException: Session is closed!
   org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
   org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:255)
   org.hibernate.loader.Loader.doQuery(Loader.java:714)
   org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
   org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
   org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:47)
   org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:41)
   org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
   org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
   org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
   org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
   org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
   org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
   org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
   org.hibernate.impl.SessionImpl.get(SessionImpl.java:799)
   org.hibernate.impl.SessionImpl.get(SessionImpl.java:792)
   persistance.HibernateManager.recupererUser(HibernateManager.java:125)
   metier.GestionUser.recupererUser(GestionUser.java:163)
   controleur.ServletFichier.doPost(ServletFichier.java:189)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


Si vous voyez une origine au soucis je suis plus que preneur.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 23, 2006 3:53 am 
Beginner
Beginner

Joined: Tue May 09, 2006 2:30 am
Posts: 22
Le HibernateUtil que tu utilises est-il correct ?

(Au fait pourquoi une transaction pour un simple get ?)

_________________
--
Celine


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 23, 2006 4:01 am 
Newbie

Joined: Thu May 11, 2006 5:35 am
Posts: 15
Location: clermont ferrand - France
J'utilise un HiberntaeUtil récupérer sur le net (dvp.com) donc je pense qu'il est correct (et il marchait) par contre je ne savais pas que pour un get on pouvait se passer de transaction.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 23, 2006 4:13 am 
Beginner
Beginner

Joined: Tue May 09, 2006 2:30 am
Posts: 22
Les transactions servent a effectuer des modifications dans ta base de donnees de facon unitaire : tu fait plein d'ajout/delete/update, et ensuite ou bien tu commit (toutes ces modifications seront validees) ou bien tu rollback (toutes les modifications seront annulees)

Pour des processus en read only, c'est completement inutile.

Pour ce qui est de ton probleme, je ne vois pas, verifie que HibernateUtil appelle bien sessionFactory.createSession() a un moment donne (log ce qu'il fait).

Sinon si tu compte utiliser Hibernate dans un projet je ne saurais trop te conseiller de te documenter sur les transactions...

Bonne chance !

_________________
--
Celine


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 23, 2006 5:06 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
euh Celine, ce n'est pas pour être méchant mais tu as tout faux sur les transactions.
TOUT est fait dans une transaction meme de simples select.
Pourquoi penses tu ce que tu penses? Car tu as été habitué par le mode autocommit qui avec le temps est reellement une abberation.
Donc KKAI, continue de bien declarer tes transactions.

Il faut que tu utilises la derniere version de hibernateUtil, regarde le guide de reference.

http://www.hibernate.org/hib_docs/v3/re ... nt-session

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 23, 2006 6:10 am 
Beginner
Beginner

Joined: Tue May 09, 2006 2:30 am
Posts: 22
Dois je comprendre que son code, sans les transaction demarctations et sans le mode autocommit ne marcherait pas ?
Je suis sure d'avoir deja fait des requetes read only en JDBC sans transactions ni autocommit, donc ca marche. En quoi les transactions sont elles utiles ici ?

(je ne cherche pas a te contredire, je cherche a comprendre ;) )

_________________
--
Celine


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 23, 2006 6:27 am 
Newbie

Joined: Thu May 11, 2006 5:35 am
Posts: 15
Location: clermont ferrand - France
Personellement, j'utilise ce HibernateUtil :
Code:
public class HibernateUtil {
   private static final SessionFactory sessionFactory;

    static {
      try {
      // Crée la SessionFactory
      sessionFactory =
       new Configuration().configure().buildSessionFactory();
      } catch (HibernateException ex) {
      throw new RuntimeException("Problème de configuration : "
      + ex.getMessage(), ex);
      }
      }

    public static final ThreadLocal session = new ThreadLocal();

    public static Session currentSession()
         throws HibernateException {
      Session s = (Session) session.get();
      // Ouvre une nouvelle Session, si ce Thread n'en a aucune
      if (s == null) {
      s = sessionFactory.openSession();
      session.set(s);
      }
      return s;
      }

    public static void closeSession()
         throws HibernateException {
      Session s = (Session) session.get();
      session.set(null);
      if (s != null)
      s.close();
      }

Qui me permet, vu que je suis en univers J2EE donc plusieur thread d'avoir à chaque instant une session par thread qui la demande (ThreadLocal)
C'est d'ailleur un des point qui me fait poser des questions car j'utilise HibernateUtil dans une classe singleton HibernateManager et je ne suis pas sur de bien gerer les session lorque mon applis era en production et qu'il y aura plusieur utilisateur à la fois :

Exemple de recuperation de session et de fermeture (je suppose que le ThreadLocal de HibernateUtil me permet d'avoir bien une session differente par requète simultané)
Code:
public Session startSession() throws HibernateException {
      return HibernateUtil.currentSession();      
   }

public void closeSession() throws HibernateException {
      HibernateUtil.closeSession();         
   }



Exemple d'utilisation :
Code:
try {
         s = accessManager.startSession();
         accessManager.startTransaction(s);
         us = accessManager.recupererUser(identifiantUser,s);
         authenticated = us.getAuthentification().verifPass(passUser,us.getTel());
      }
      catch (HibernateException e){
         e.printStackTrace();
         throw e;
      }


Comment avec le HibernteUtil de la doc puis-je retrouver ma protection pour un univers web et donc des requète de plusieur client en même temps et que certains traitements ne ferment pas la session qu'utilise d'autres traitements ?


Top
 Profile  
 
 Post subject:
PostPosted: Sat Jun 24, 2006 6:47 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
SessionFactory.getCurrentSession() fait tout le job pour toi.
Je n'ai pas le temps de regarder ton code dans le detail, désolé.
Referre toi a l'exemple caveatemptor stp.

Je ne sais pas si ton probleme vient de la mais il y a des chances.

Celine,
une demande à la base de données, peu importe que ce soit un Select ou autre s'effectue TOUJOURS dans une transaction.

Si sans autocommit et sans coder de begintx a fonctionné, ça ne veut pas dire que c'est bien de le faire ;), je 'peux' tres bien prendre une autoroute en marche arriere, ça marche mais c'est pas bien ;)

Christian va sortir Java Persistence With Hibernate, il y a un gros chapitre sur les transactions, je te le conseille.
On a tous été mal eduqués avec le temps du 'plain JBDC', on a tous a un moment pensé comme toi et d'ailleurs beaucoup ne comprenne pas toute la definition d'une transaction.

Dans ton cas, penche toi sur le probleme du repeatable read...

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 26, 2006 3:59 am 
Newbie

Joined: Thu May 11, 2006 5:35 am
Posts: 15
Location: clermont ferrand - France
Quelqu'un pourrait t'il m'explicité quelque peut la configuration et l'utilisation de la sessionFactory en mode ThreadSafe. J'ai vue la classe ThreadLocalSessionContext et tout cela, le code source de Caveaemptor mais je ne vois pas bien comment mettre tout cela en place et comment l'utiliser ?

Dans un univers web avec Servlet, quel est la meilleure porté pour la session :
- Transaction
- Requète HTTP
- Session HTTP

Quel contexte vaut t'il mieux utiliser : JTA associé à Tomcat
ThreadLocalSessionContext

Voila je suis pas mal paumé dans la config d'Hibernate.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 9 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.