2012-08-17 13 views
5

Wie kann ich eine Eins-zu-viele-Beziehung in Hibernate abbilden, in der die Vielseitige paginiert werden muss? (Das heißt, Sie haben Hunderte oder mehr verwandte Objekte) Die Verwendung der Annotation OneToMany (oder deren XML-Äquivalent) ist nicht sinnvoll, da das Laden des einseitigen Objekts alle zugehörigen Objekte abruft, was zu einem Speicherausfall führt (obwohl Sie faul verwenden) Wird geladen).
Ein möglicher Ansatz (den ich bereits verwende) ist das Hinzufügen einer Getter-Methode in einer DAO-Implementierung, in der Sie Paginierungsparameter einführen können. Ich kann jedoch sehen, dass dies nicht ideal ist, weil Sie einige Funktionen wie Kaskadierung verlieren (z. B. muss ich Setter-Methoden in die DAO-Klasse einschließen, um Objekte zu assoziieren). Außerdem verlieren Sie einen gewissen OOP-Sinn, da das einseitige Objekt keine Methode zum Abrufen der zugehörigen vielseitigen Objekte besitzt. Was ist die beste Lösung?
Um meinen Punkt weiter zu veranschaulichen, nehmen wir an, ich habe zwei Klassen mit folgender Beziehung: A has-many B.
Ich kann keine A.getAllB() -Methode mit OneToMany Annotation schreiben, da es Hunderte gibt von Bs bezogen auf A. Um die Ergebnisse zu paginieren, erstelle ich eine separate ADaoImpl-Klasse mit einer getAllB() -Methode, wobei ich Paginierungs-Parameter einschließen kann, um jeweils nur eine Seite von Daten zurückzugeben. Ist das richtig? Jede Hilfe wird geschätzt.Hibernate-paginierte OneToMany-Beziehung

Antwort

2

Ich denke, ich würde das gleiche tun, was Sie vorschlagen: Erstellen Sie eine neue Methode auf meinem Dao, die Paginierung Parameter übernimmt und die angegebene Seite der Ergebnisse zurückgibt. Ob Sie die untergeordneten Elemente in Ihrem übergeordneten Objekt behalten möchten, liegt ganz bei Ihnen. Sie können ein Übergangsfeld für diese Objekte erstellen.

public class Parent { 
    @Transient 
    private List<Child> children; 

    } 

    public class ParentDao { 

    // Solution 1 - You can keep the parent/child association 
    public void loadChildren(Parent parent, int firstResult, int maxResults) { 
     // do your query 
     parent.setChildren(query.list()); 
    } 

    // Solution 2 - Or just have your dao directly return the children and remove the list from Parent 
    public List<Children> getChildren(Parent parent, int firstResult, int maxResults) { 
     // do your query 
     return query.list(); 
    } 
    } 

Ich weiß, was Sie meinen, über Ihr OO Gefühl des Codes zu brechen. Aber die Paginierung ist eine Funktion der Datenschicht. Wenn Sie mit der ersten Lösung fortfahren, können Sie vielleicht etwas von diesem netten "OO" -Feeling wiederherstellen.