web-dev-qa-db-fra.com

Hibernate Session est fermé

Lorsque j'appelle la transaction méthode session.begin comme suit:

//session factory is instantiated via a bean
Session session = this.getSessionFactory().getCurrentSession();
session.beginTransaction();

Puis j'obtiens le message d'exception suivant

6:13:52,217 ERROR [STDERR] org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.Java:49)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.Java:1319)

Quelle pourrait être la cause de cette erreur?

15

Mise à jour: Je suppose que l'appel de getCurrentSession() ne garantit pas que la session est réellement ouverte. Pour la toute première fois, vous devriez utiliser

Session session = this.getSessionFactory().openSession();
session.beginTransaction();

au lieu. Cette suggestion est en fait cohérente avec la page que vous avez trouvée.

Plus tôt:

Sur la base des informations disponibles à ce jour, nous pouvons conclure que l'erreur est due à l'absence de session ouverte ;-)

25
Péter Török

Je pense avoir trouvé la réponse dans:

La session est fermée

Je suis encore à le mettre en œuvre

7

Vous pouvez utiliser cette annotation sur votre méthode de contrôleur:

@Transactional(readOnly = true)
4
ACV

Au lieu de fermer complètement la session, vous pouvez utiliser session.disconnect(), effectuer un autre travail, puis session.reconnect() avant d'effectuer d'autres transactions.

session.close() serait appelé à la toute fin du processus de demande/de gestion.

Dans Hibernate 2.1.8, nous utilisons le modèle session par requête et il fonctionne bien, évitant les fuites de session, etc.

Voir ici pour plus de précisions

1
Bizmarck

Cela peut être la raison 

session.close();
tx.commit();

La bonne façon serait:

tx.commit();
session.close();
0
Mohammed Afsul

J'ai eu le même problème de session fermée en Hibernate il y a un an. MA QUESTION

mais c’était pour une raison différente, j’ai mis ceci ici au cas où quelqu'un ferait face à ce problème et voudrait en savoir plus.

0
Saher Ahwal

Pour gérer la session est une exception fermée:

1-) Dans votre fichier hibernate.cfg, changez le hibernate.current_session_context_class par défaut en managed au lieu de thread

2-) Créez deux méthodes pour ouvrir et fermer la session correctement et utilisez les méthodes avant et après votre requête, comme indiqué ci-dessous:

 public static void renewSession() {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.setFlushMode(FlushMode.MANUAL);
             ManagedSessionContext.bind(session);
             session.beginTransaction();
       } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static void closeSession()
    {
       try {
       ManagedSessionContext.unbind(HibernateUtil.getSessionFactory());
                  session.flush();
                 session.getTransaction().commit();
            session.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

Usage: 

try {
                renewSession();
                String query = "from Table tb";
               data = (List<TypeObject>)session.createQuery(query).list();
                closeSession();
            } catch (Exception e) {
                e.printStackTrace();
            }
0
EngTiyeb