Hibernate Session closed nach Transaction commit?

Status
Nicht offen für weitere Antworten.

eliot

Bekanntes Mitglied
Hallo,

ich nutze hier Hibernate 3.3.0.SP1 und habe ein Problem mitt meiner Hibernate Session.
Ich habe eine Klasse Unternehmen eine Eine Klasse Fahrer.
Ein Unternehmen hate eine Liste von Fahrern (bidirektional, LAZY).

Ich persistiere ein Unternehmen mit mehreren Fahrern in einer Transaktion.

sf.getCurrentSession().beginTransaction();
...do some persist...
sf.getCurrentSession().getTransacrtion.commit();

So weit, so gut;
Ich setzte das Unternehmen auf null und hole es mir erneut aus der DB.
Ich habe die Session nicht geschlossen!
Wenn ich nun durch die Fahrer iterieren will,
bekomme ich eine org.hibernate.LazyInitializationException, obwohl die Session vorhanden
und nicht geschlossen ist?!
Überprüft habe ich dieses vor dem Aufruf des Iterierens mit session.isOpen().

Der Session Kontext ist auf thread gestellt und alle Operation erfolgen im gleichen Thread.

Habe ich jetzt einen Denkfehler oder paßt da in hibernate etwas nicht?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> Überprüft habe ich dieses vor dem Aufruf des Iterierens mit session.isOpen().

prüfe dies auch während des Iterierens bzw. im catch der Lazy-Exception,
vergewissere dich auch ganz genau, um welches Objekt es aktuell geht und auf welche Session du schaust,
am besten mit hashCode() und einem Log a la

System.out.println("lade Unternehmen "+u.hashCode()+", in Session "+s.hashCode());

...

System.out.println("iteriere nun Unternehmen "+u.hashCode()+", Session ist "+s.hashCode()+", offen? "+s.isOpen());
usw.

dann gibts noch
System.out.println(getSession().toString());
mit Ausgabe des Caches, also z.B.
"SessionImpl(PersistenceContext[entityKeys=[EntityKey[package.Klassenname#1373], EntityKey[package.Klassenname#1374].."

das bringt zwar nicht den genauen HashCode, aber zumindest die gecachten Objekte mit Id,
wenn da nix drinsteht, dann sind Lazy-Exceptions wahrscheinlich

getSession().contains(objekt)
hilft auch, wenn das am Anfang direkt nach dem Laden true ergibt und bei der Exception false,
dann rufe das nach dem Laden alle x Befehle auf, dann siehst du, ab welcher Stelle es nicht mehr klappt
 

eliot

Bekanntes Mitglied
Hallo,

so ich habe das ganze nochmal nachvollzogen, hier ein kleines Beispiel (Pseudo Code):

facade.beginTransaction();
facade.persist(company);
facade.commitTransation;

company=null;

facade.beginTransaction();
company = facade.getCompany(); //ist mitlerweile nötig, keine Selects mehr außerhalb einer Session, sehr merkwürdig
facade.getCurrrentSession().contains(company); //gibt true;

for(Company c:company.getVehicles()){
System.out.println(c);
}
facade.commitTransaction(); //alles ok soweit

//jetzt kommt das Interessante:

company=null;

facade.beginTransaction();
company = facade.getCompany();
facade.getCurrrentSession().contains(company); //gibt true;
facade.commitTransaction();

facade.getCurrrentSession().contains(company); //gibt false;

for(Company c:company.getVehicles()){
System.out.println(c);
} //lazy loading exception


Die Session ist die ganze Zeit über das selbe Objekt!

Fazit:
Select sind nur noch innerhalb einer Transaktion möglich?!
Lazy loading kann nur innerhalb einer Transaction aufgelöst werden.

Ja bin ich denn deppert?
Eine kleine google Session sagt das glieche: Selects nur in Transaction,
somit kann das lazy loading nicht aufgelöst werde, wenn keine Transaction offen ist.

damit hätten Transaktionen den gliechen Stellenwert wie Sessions.
Nun steht das aber krassen Gegensatz zu dem was ich mal gelernt habe:

Transkation: wenn Änderungen in der DB vorgenommen werden, sperrt Zeilen einer Tabelle, möglichst kurz
Session: für selects, speert keine Zeilen Tabelle, pro Thread.

Was, wieso, warum?
Ich versteh nichts mehr, ...
 
S

SlaterB

Gast
wußte ich jetzt auch gar nicht so genau, scheint als gegeben hinzunehmen zu sein

vielleicht deswegen:
Because Hibernate can't bind the "current session" to a transaction, as it does in a JTA environment, it binds it to the current Java thread. It is opened when getCurrentSession() is called for the first time, but in a "proxied" state that doesn't allow you to do anything except start a transaction. When the transaction ends, either through commit or roll back, the "current" Session is closed automatically.
https://www.hibernate.org/42.html#A6
bei anderen Sessions (Pool) vielleicht weniger restriktiv

---

oder das ist auch generell nicht so schlecht, zu transaktionsgesicherten Daten später noch was ohne Transaktion dazuladen..,
na ich möchte da nicht zuviel philosophieren
 
Zuletzt bearbeitet von einem Moderator:

byte

Top Contributor
Transkation: wenn Änderungen in der DB vorgenommen werden, sperrt Zeilen einer Tabelle, möglichst kurz
Session: für selects, speert keine Zeilen Tabelle, pro Thread.

Dann hast Du offenbar beim Thema Transaction Isolation gepennt. ;)

Hibernate braucht immer eine offene Transaktion. Aber das ist ja auch gut so. Die Alternative wäre Auto-Commit und das sollte man nun wirklich vermeiden.

Natürlich werden bei offener Transaktion nicht perse Tabellenzeilen gesperrt! Was die DB genau macht, hängt von der Art der DB und der realisierten Isolation der Transaktionen ab. Wenn Deine DB wirklich die Zeilen während der Transaktion lockt, würde ich mir mal auf ne vernünftige DB umsteigen. ;)


Wenn Du nicht möchtest, dass Deine Session mit dem Commit geflusht und geschlossen wird, dann darfst Du sie nicht per getCurrentSession() holen sondern per openSession(). Dann musst Du Dich aber auch manuell ums flushen und closen kümmern. IdR ist das unnötig.

Wenn Du Lazy Init Exceptions bekommst, musst Du das Objekt vorher entweder wieder an eine neue Session binden oder Du lädst im Idealfall die nötigen Daten per FETCH JOIN direkt vor. Dann sparst Du Dir auch das zusätzliche SELECT.
 

eliot

Bekanntes Mitglied
Hallo,

das würde den Unterschied erklären, da ich früher tatsächlich über OpenSession gearbeitet habe
und erst für kurzem auf getCurrentSession umgestiegen bin.
Das Objekt erneut an die DB binden? D.H. Transkation öffnen, danach eine resfresh?

Das Problem ist folgendes: Ich habe mehrere Threads, jeder soll seine eigene Session haben.
Genau dieses bietet mir getCurrentSession. Wenn ich mit openSession Arbeite müßte ich
ich eigene Strategien entwickeln um für jeden Thread eine Session zu haben, oder?

regards
eliot

EDIT: Was ich allerdings nicht verstehe: Wieso brauch Hibernate eine Transaktion beim Select auf eine Tabelle?
Und wieso nur über getCurrentSession()? und bei openSession nicht? Wo liegt der Unterschied?

Dann hast Du offenbar beim Thema Transaction Isolation gepennt. ;)

Hibernate braucht immer eine offene Transaktion. Aber das ist ja auch gut so. Die Alternative wäre Auto-Commit und das sollte man nun wirklich vermeiden.

Natürlich werden bei offener Transaktion nicht perse Tabellenzeilen gesperrt! Was die DB genau macht, hängt von der Art der DB und der realisierten Isolation der Transaktionen ab. Wenn Deine DB wirklich die Zeilen während der Transaktion lockt, würde ich mir mal auf ne vernünftige DB umsteigen. ;)


Wenn Du nicht möchtest, dass Deine Session mit dem Commit geflusht und geschlossen wird, dann darfst Du sie nicht per getCurrentSession() holen sondern per openSession(). Dann musst Du Dich aber auch manuell ums flushen und closen kümmern. IdR ist das unnötig.

Wenn Du Lazy Init Exceptions bekommst, musst Du das Objekt vorher entweder wieder an eine neue Session binden oder Du lädst im Idealfall die nötigen Daten per FETCH JOIN direkt vor. Dann sparst Du Dir auch das zusätzliche SELECT.
 
Zuletzt bearbeitet:

byte

Top Contributor
Du kannst das Scope der Current Session konfigurieren durch den Parameter hibernate.current_session_context_class. Der Default Wert ist jta, wodurch die Session an die aktuelle Transaktion gebunden ist. Wenn Du den Wert auf thread machst, sollte die Session beim Commit nicht geschlossen werden, bin mir da aber nicht sicher. Was hast Du da konfiguriert?

Es ist auf jeden Fall nicht anzuraten, die Session zu lange offen zu lassen. Du kannst Dir jeder Zeit eine neue Session holen und eine Detached Entity über die neue Session speichern (per update() oder merge(), siehe Abschnitt 10.6 in der Referenz Doku).
 

eliot

Bekanntes Mitglied
Hallo,

mein Scope ist Thread.
ich habe es jetzt wie folgt verstanden und im Programm nachvollzogen:

getCurrentSession():

Liefert pro Thread die gleiche Session (bei Scope Thread), Transaktion nötig, Managed by Hibernate,
Session wird nicht geschlossen, allerdings müssen die Entities mit resrech wieder an die Session
gebunden werden, bei einer neuen Transaktion.

openSession():

Neue Session, ich muss mich selber um flush und close kümmern.

Vielen Dank für eure Hilfe!

Je nach Situation ist das eine oder das andere zu verwenden, mischen scheint kein Problem
darzustellen.

Du kannst das Scope der Current Session konfigurieren durch den Parameter hibernate.current_session_context_class. Der Default Wert ist jta, wodurch die Session an die aktuelle Transaktion gebunden ist. Wenn Du den Wert auf thread machst, sollte die Session beim Commit nicht geschlossen werden, bin mir da aber nicht sicher. Was hast Du da konfiguriert?

Es ist auf jeden Fall nicht anzuraten, die Session zu lange offen zu lassen. Du kannst Dir jeder Zeit eine neue Session holen und eine Detached Entity über die neue Session speichern (per update() oder merge(), siehe Abschnitt 10.6 in der Referenz Doku).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
timbeau Hibernate - Session(Factory) : Speicherung der Queries/Results Datenbankprogrammierung 4
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
N hibernate: datasource Datenbankprogrammierung 7
H MySQL Hibernate: Updaten vereinfachen Datenbankprogrammierung 2
T Hibernate Division zweier Summen Datenbankprogrammierung 4
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
F GWT und Hibernate - gwt.dev.Compler not found Datenbankprogrammierung 3
M NestedTransaction- Exception in Hibernate Datenbankprogrammierung 15

Ähnliche Java Themen

Neue Themen


Oben