2013-09-30 8 views
5

Ich benutze Hibernate 4.2.4 mit JPA und Layz Laden in einer ManyToMany Association. Objekt A steht in Verbindung mit @ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY) und umgekehrt. Um Daten aus der Datenbank ich folgende (vereinfachte) Code aufrufen:Hibernate Session-Behandlung mit Lazy Loading

try { 
    session = cutSessionFactory.openSession(); 
    session.beginTransaction(); 
    List<IBO> result = session.createQuery(query).list(); 
    session.getTransaction().commit(); 
    return result; 
catch{...} 
finally{ 
    session.close; 
} 

Ursprünglich habe ich die Verbindung lassen offen, führen, wenn meine Anwendung etwas verzögertes Laden zu tun, muss die Sitzung noch nach dem ersten Aufruf benötigt wird. Aber während dies meine Anwendung nach einigen Aktionen zum Einfrieren brachte, wechselte ich zur vorherigen Strategie. Jetzt funktioniert alles; kein Einfrieren, kein Problem beim Lazy Loading. Aber wenn ich eine Einheit laden, die einige Kinder hat (das requieres träges Laden) das Protokoll sagt:

WARN - AbstractPersistentCollection: Unable to close temporary session used to load lazy collection associated to no session

von

2013-09-25 09:35:30 - INFO - BasicResourcePool: A checked-out resource is overdue, and will be destroyed: [email protected] 
2013-09-25 09:35:30 - INFO - BasicResourcePool: Logging the stack trace by which the overdue resource was checked-out 

gefolgt Es ist sinnvoll, die nicht Schließen der Sitzung überwintern wird (Eigentlich dachte ich, es gibt eine neue Anfrage für Lazy Loading, die eine neue Sitzung verwendet) und der Verbindungspool erkennt, dass es eine unbenutzte Sitzung gibt. Aber am Ende behebt Hibernate meine "schlechte Session-Handhabung".

Also weiß jemand eine bessere Möglichkeit, Sitzungen mit Lazy Loading zu behandeln?

+0

haben Sie eine finden Antworten? Wenn diese Warnung angezeigt wird, ist die Verbindung (von c3p0) geschlossen? oder gibt es ein Verbindungspool-Leck? – OhadR

Antwort

0

Natürlich müssen wir die Sitzung schließen, sonst funktioniert die Anwendung möglicherweise nicht richtig.

Auch sollten wir versuchen, verschachtelte Objekte faul für bessere Leistung zu halten und obligatorische Joins hinzuzufügen.

Wenn Sie das untergeordnete Element zugreifen müssen Sie anwenden müssen, um in der Abfrage zu verbinden, so dass der faule Objekt wird zum Beispiel geladen werden:

class A{ 
     B b; 
} 

sql:

select * from A Left join B on A.bid = B.id