2010-03-04 7 views
15
geschlossen

Wenn ich die Methode session.begin Transaktion wie folgt aufrufen:Hibernate Session wird

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

Dann bekomme ich die folgende Ausnahmemeldung

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) 

Was könnte die Ursache für diesen Fehler sein?

+2

Was machen Sie _before_ diese Ausnahme? Sende den Code bitte. –

+2

Gerade jetzt, Es ist wie ein Mystery-Film. – Padmarag

+0

Wie haben Sie die Sitzung erhalten? –

Antwort

25

Update: Ich denke, dass Aufruf getCurrentSession() nicht garantiert, dass die Sitzung tatsächlich geöffnet ist. Zum allerersten Mal sollten Sie stattdessen

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

verwenden. Dieser Vorschlag stimmt tatsächlich mit der Seite überein, die Sie gefunden haben.

Früher:

Auf der Grundlage der bisher vorliegenden Informationen können wir schließen, dass die Ursache des Fehlers ist die Sitzung nicht offen ;-)

+0

+1 Stimme vollständig zu. – Padmarag

+0

Siehe auch http://stackoverflow.com/questions/8046662/hibernate-openssession-vs-getcurrentsession – rogerdpack

7

Ich glaube, ich die Antwort gefunden:

Session is Closed

ich bin noch zu ihrer Umsetzung

+0

Froh, dass Sie das Geheimnis gelöst haben. – Padmarag

0

T

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

Ich hatte das gleiche Hibernate Session Closed Problem vor einem Jahr: sein kann der Grund

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

Der richtige Weg wäre sein. MY QUESTION

aber es war aus einem anderen Grund, ich stelle dies hier für den Fall, dass jemand mit diesem Problem konfrontiert ist und mehr darüber wissen will.

1

Anstatt die Sitzung vollständig zu schließen, können Sie session.disconnect() verwenden, andere Arbeiten ausführen und dann session.reconnect(), bevor Sie andere Transaktionen ausführen.

session.close() würde am Ende der Anfrage/Geschäftsprozess aufgerufen werden.

In Hibernate 2.1.8 wir eine Sitzung pro Anfrage Modell verwendet haben und es funktioniert gut, Sitzung Lecks zu vermeiden, usw.

here Siehe einige Ausarbeitung

2

Sie diese Anmerkung verwenden können auf Ihrem Controller-Methode:

@Transactional(readOnly = true) 
+0

Das Attribut readOnly ist nicht definiert für den Annotationstyp Transactional –

+0

Ich bezog mich auf diese 'import org.springframework.transaction.annotation.Transactional; ' – ACV

Verwandte Themen