JPA TreeStruktur mit ManyToMany Relation

facefab

Mitglied
Hi,
Ich hab folgendes Setup mit einer Baumstuktur, welche durch die Klasse TreeNode abgebildet wird. Bei dieser Baumstruktur können die TreeNode-Objekte des Baumes, welche als Blätter auftreten ein Objekt der Klasse Device enhalten. Die Deviceobjekte können dabei auch mehreren TreeNode-Blättern zugeordnet werden. Das Problem das bei mir nun auftritt, ist dass das Deviceobjekt wissen soll, welchen (elterlichen) TreeNodes es zugeordnet ist. (Also das Parent-Objekt des Blattes, welches das Device-Objekt enthält. Diese ParentObjekte werden in der Liste "classes" in Device gespeichert.)

Hier der Code von TreeNode:
Java:
@Id
    @GeneratedValue
    protected Long id;
    protected String name="";
   
    @ManyToOne
    protected Device device = null;
   
    @ManyToOne
    @JoinColumn(name="parent_id")
    protected TreeNode parent = null;
   
   
     @OneToMany(mappedBy="parent", fetch = FetchType.EAGER)
     protected Set<TreeNode> children = new HashSet<TreeNode>();

Hier der Code von Device:
Java:
@Id
    @GeneratedValue
    private Long id;
    protected String name="";
       
       
    @ManyToMany//(mappedBy="parent", fetch = FetchType.EAGER)
    protected List<TreeNode> classes = new ArrayList<TreeNode>();

Das Problem ist nun, dass mir nun beim Laden eines Deviceobjekts aus der DB entweder mehrmals dieselbe Device - TreeNode Relation gelistet wird ( für den Fall, dass " protected List<TreeNode> classes" nur mit "@ManyToMany" annotiert ist, oder dass gar keine Relationen gespeichert werden, (für den Fall, dass "(mappedBy="parent", fetch = FetchType.EAGER)" Teil der Annotation ist))
 

stg

Top Contributor
So wie ich dich verstehe sollte es in Devices:

Java:
@OneToMany(mappedBy="device", fetch = FetchType.EAGER)
protected List<TreeNode> classes;

Ggfls auf der anderen Seite noch die @JoinColumn definieren.
 

facefab

Mitglied
Vielen Dank für Deine Hilfe. Der Urlaub hat mich gerade von einer schnelleren Response abgehalten :) Das mappedBy muss sich aber schon auf parent beziehen. In der Liste classes soll auf die parent-Knoten verwiesen werden (die indiesem Fall einer Geräteklasse entsprechen). Das Device-Objekt selbst wird zwar auch in einem (oder mehreren) TreeNode(s) referenziert (um es als Blatt im Baum darstellen zu können), aber davon weiss das Device-Objekt nichts. Es soll ihm nur bekannt sein, zu welchen übergerodneten Knoten (Geräteklassen) es gehört.
 

Ähnliche Java Themen


Oben