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?
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 ;-)
Vous pouvez utiliser cette annotation sur votre méthode de contrôleur:
@Transactional(readOnly = true)
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
Cela peut être la raison
session.close();
tx.commit();
La bonne façon serait:
tx.commit();
session.close();
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.
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();
}