2012-04-12 7 views
3

Ich habe Baumstrukturen, die in einer DB-Tabelle gespeichert sind. Die Tabelle kann mehrere Bäume speichern. Ich brauche eine Abfrage, die alle Knoten in einem einzigen Baum zurückgibt. Ich habe die folgenden Sites als Ressourcen verwendet, aber die Abfragen darin laden alle Knoten für alle Bäume in PersistenceContext (lädt nicht die gesamte Tabelle?). Ich möchte das nicht machen, ich möchte nur einen Baum laden. Wie erreiche ich das?JPA-Abfrage für alle Knoten in einem einzigen Baum

Ich verwende JPA 2 mit Hibernate als Provider.

OpenJPA 1.2.x select tree structure using JPQL
http://www.tikalk.com/java/load-a-tree-with-jpa-and-hibernate#comment-1821

[UPDATE] Basierend auf einem Vorschlag von @bennidi, frage ich mich, ob ich etwas wie folgt verwenden können:

@Entity 
public class Node { 

    private String name; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "rootId") 
    private Node root; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "parentId") 
    private Node parent; 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @OrderBy("name") 
    private List<Node> children = new LinkedList<Node>(); 
} 

JPQL query:

select distinct n from Node n left join fetch n.children where n.rootId = ROOT_ID 

Ich habe jedoch eine Frage, sollte ich eine zweite Tabelle erstellen, um die Eltern-Kind-Beziehungen wie in 01 zu pflegen, oder wird es in Ordnung sein, wenn ich nur eine selbstreferenzierende Tabelle verwendet habe. Mit dem ersten zu gehen scheint ein bisschen mehr Wartung und wahrscheinlich ein wenig komplexere Abfragen zu erfordern. Ist es das wert? Ich bin nicht sicher, welche Probleme der Artikel anspricht.

+0

dies eine gute Idee ist, du mich hier gab !! Hast du einen Weg gefunden für den Vizeblock? – azerafati

+0

und für die Info alle fetchTypes, die Sie hier verwenden, sind Standardeinstellungen! Sie könnten sie entfernen und sie alle wären gleich – azerafati

Antwort

0

Ich denke, es ist nicht natürlich, rekursive Strukturen in relationalen Datenbanken zu speichern. Die Antwort auf Ihre Frage hängt auch von dem Schema ab, das Sie zum Modellieren Ihrer Knoten und Bäume auswählen. Wenn Sie über eine sich selbst referenzierende Knotentabelle verfügen, die die übergeordneten untergeordneten Beziehungen als Fremdschlüssel enthält, können Sie nicht alle Knoten auswählen, die untergeordnete Knoten eines bestimmten Knotens mit einer Abfrage sind. Ich denke, du solltest für jeden Baum eine Tabelle haben und jeden Knoten auf seinen Baum verweisen lassen. Dann können Sie einfach alle Knoten eines bestimmten Baumes auswählen und die Baumstruktur durch Analyse der Knoten erstellen.

Werfen Sie einen Blick auf diesen Beitrag: http://www.codeproject.com/Articles/8355/Trees-in-SQL-databases

+0

Danke für den Artikel. Das hat mir eine Idee gegeben, ich werde meine ursprüngliche Frage aktualisieren. – citress

+0

Ich denke, der vorgeschlagene Code/Mapping sieht sehr vielversprechend aus. Funktioniert es wie erwartet? – bennidi

+0

In meinen Integrationstests sieht es so aus, als ob alles korrekt funktioniert. – citress

Verwandte Themen