2011-01-03 4 views
0

Ich habe eine Reihe von Hibernate gemappten Objekten in meiner Spring MVC App. Der Standardwert scheint das Laden von verschachtelten Objekten mit Beziehungen zu sein. Ich erkannte dies, indem ich eine Menge Fehler in meiner JSP erhielt, wenn z. eine Liste von Kinderobjekten.Richtige Verwendung von getHibernateTemplate() in Spring MVC App?

Also habe ich eine zweite Methode implementiert, um eine Liste von Objekten mit allen untergeordneten Kindern zu erhalten. Ich habe mich gefragt, ob mir jemand Feedback geben könnte, ob das der richtige Weg ist oder nicht?

Dies ist mein Code in meine DAO-Implementierung, die funktioniert:

public List<Address> getTripListFullyInitliazed() { 

    HibernateTemplate template = getHibernateTemplate(); 

    List<Address> addresses = template.loadAll(Address.class); 
    for (Address address : address) { 
     template.initialize(address.getChildren()); 
    } 
    return addresses; 
} 

Kann mir bitte jemand sagen, ob dies in Ordnung zu tun, oder ob ich etwas ändern?

+0

Wenn es für Sie funktioniert, dann ist es in Ordnung – skaffman

+0

welche Version des Frühlings? – hvgotcodes

+0

Version: Frühling 3 – Czar

Antwort

3

Ich denke, ein eleganter Ansatz wäre HQL verwenden JOIN FETCH Klausel, da sie die Anzahl der SQL-Abfragen ausgegeben minimiert, sowie macht den Code klar:

public List<Address> getTripListFullyInitliazed() { 
    return getHibernateTemplate().find(
     "from Address a left join fetch a.children"); 
} 

Siehe auch:

+0

Hm ... Ich muss einige Dokumentation darüber lesen, da ich nicht verstehe, wie ich das z. im obigen Code. Aber danke für den Hinweis. – Czar

+1

@Czar: Code aktualisiert. Diese Abfrage weist Hibernate an, Entitäten mit vollständig initialisierten "Children" -Auflistungen zurückzugeben. – axtavt

+0

THX. Soll man HQl wirklich auch verwenden, wenn es auch diese Standardmethoden gibt? – Czar

2

Ich denke, die Standardlösung für dieses Problem OpenSessionInViewFilter zu verwenden ist:

Servlet 2.3 Filter, die für die gesamte Verarbeitung der Anforderung eine Ruhe Session auf den Faden binden. Vorgesehen für das "Open Session in View" -Muster, d. H. Um ein verzögertes Laden in Web-Ansichten zu ermöglichen, obwohl die ursprünglichen Transaktionen bereits abgeschlossen sind.

Dieser Filter macht Hibernate-Sitzungen über den aktuellen Thread verfügbar, der von Transaktionsmanagern automatisch erkannt wird. Es eignet sich für Service-Layer-Transaktionen über HibernateTransactionManager oder JtaTransactionManager sowie für nicht-transaktionale Ausführung (bei entsprechender Konfiguration).

+0

Definitiv die beste Lösung, JOIN-Operation zu verwenden, wird schwierig, während komplexer Abfragen. – Kartoch

+0

Ich verwende kein JOIN direkt? – Czar