2015-05-19 6 views
5

Ich habe Eltern-/Kind-Beziehung in einem einzigen Tisch, lassen Sie uns einfach sagen, wieHibernate selben Tisch Eltern/Kind-Beziehung

id | parent_id | some_data 

Ich versuche, beste Praktiken zu verstehen/Arbeitsgeräte wie für einzelne Hibernate Klassen bauen Tabellenbeziehung.

Ich habe einen Feed, der von irgendwo kommt und es hat geschachtelte JSON-Struktur, also nach dem Parsen es möchte ich es Darstellung in OracleDB haben.

-Feed sieht wie

{ 
    1: 
     => 2: 
       => 3 
       => 4: 
         => 5 
     => 6 
} 

diese Daten in db als am Ende sollte:

1 | 0 (main rec, no parent) 
2 | 1 
3 | 2 
4 | 2 
5 | 4 
6 | 1 

Und es könnte immer tiefer gehen ...

Ich möchte JSON zu durchqueren Struktur und bauen Klassen, die ich am Ende in db speichern

session.save(parent) 

Eltern wäre eine Instanz meiner Hibernate-Mapped-Klasse, sagen wir es Feed.

Jedes Mal, wenn ich einen Baum abnehme, erstellt er einen neuen Feed, findet ihn als Elternteil und fügt ihn der Liste hinzu.

Feed **parent** = new Feed(); 

    -> Feed child2 = new Feed(); 
     child2.setParent(parent) 
     parent.add(child2); 

     -> Feed child3 = new Feed(); 
      child3.setParent(child2) 
      child2.add(child3); 

      Feed child4 = new Feed(); 
      child4.setParent(child2) 
      child2.add(child4); 

............. 

session.save(**parent**) 

Meine Frage ist, könnte ich @ManyToOne und @OneToMany Ansatz verwenden?

Ich schaute auch @Inheritance (Strategie = InheritanceType.SINGLE_TABLE), aber ich glaube nicht, dass ich es auf mein Problem anwenden könnte, da ich Eltern nicht kenne, sie sind dynamisch. Ich konnte keine Elternklasse erstellen und sie erweitern.

Unterm Strich also ich versuche, zwei Probleme auf einer übergeordneten Ebene

  1. Einfach zu lösen speichern

  2. Wie man Daten von einem Elternteil zu einem Blatt bekommen, wenn ich es brauche

Einige Hibernate Mapped Klassen Beispiel würde sehr geschätzt werden.

Antwort

6

Scheint, wie alles, was ich zu tun, ist notwendig, um:

@Entity 
@Table(name = "table_name") 
public class TableName{ 

...... 

@Transient 
private Long parentId; 

...... 

@ManyToOne(fetch = FetchType.LAZY, optional=true) 
@JoinColumn(name="parent_id") 
private TableName parent; 

@OneToMany(mappedBy="parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true) 
private Set<TableName> children = new HashSet<TableName>(); 

als nur

TableName papa = new TableName(); 
papa.setParent(null); // parent 

    TableName kid1 = new TableName(); 
    kid1.setParent(papa); 
    papa.getChildren().add(kid1); 

     TableName kid1_1 = new TableName(); 
     kid1_1.setParent(kid1); 
     kid1.getChildren().add(kid1_1); 

    TableName kid2 = new TableName(); 
    kid2.setParent(papa); 
    papa.getChildren().add(kid2); 


session.save(papa) 
0

Warum erstellen Sie nicht eine sich auf eine Beziehung beziehende self-Beziehung, die cascade = all beibehält. So müssen einzelne untergeordnete Objekte nicht separat gespeichert werden. Nur das Speichern von Eltern ist genug. Beispielsweise.

Adding a one to many relationship to a self reference parent/child

+0

das ist, was ich, um herauszufinden, ich versuche, und der Suche nach den besten Ansatz zu tun eine solche Konfiguration – antohoho