Hibernate Umsetzung multiple OneToMany Beziehung

Dieses Thema Hibernate - Umsetzung multiple OneToMany Beziehung im Forum "Data Tier" wurde erstellt von denis7788, 18. Okt. 2015.

Thema: Umsetzung multiple OneToMany Beziehung Hallo, ich möchte zwei Dinge umsetzen, bin mir aber nicht sicher wie genau ich es machen soll: 1) Ich habe eine...

  1. Hallo,

    ich möchte zwei Dinge umsetzen, bin mir aber nicht sicher wie genau ich es machen soll:

    1) Ich habe eine Entity Chapter, das sind Kapitel, die jeweils Unterkapitel haben können. Ich würde gerne die Anzahl der Kind-Ebenen offen lassen (also subChapter, subSubChapter, ....). Zur Zeit habe ich drei Ebenen, aber mit jeweils eigener Entity umgesetzt. Das ist aber irgendwie überflüssig, da die Entitäten genau gleich sind und zudem die Anzahl an Ebenen fest vorgegeben ist. Wie könnte ich das denn lösen?

    2) Ich habe die Entität "Requirements". Diese soll von vielen anderen Entitäten in einer OneToMany Beziehung stehen (Requirements auf der Many-Seite). Wie kann ich die Entität Requirements am besten referenzieren. Bisher habe ich bei einer einzelnen OneToMany Beziehung immer @JoinColumn angegeben um keine unnötigen Tabellen zu generieren und den Fremdschlüssel in der Requirements Tabelle zu halten. Funktioniert das auch bei einer Vielzahl solcher OneToMany Referenzen?
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. zu 1:
    Code (Text):

    @Entity
    public class Chapter{

       @OneToMany
        private List<Chapter> subChapters;

    }
     
     
  4. stg
    stg
    und zu 2)
    Ja, das funktioniert dann auch.
    Ich würde aber vermutlich den Weg über Join-Tabellen nehmen, um die Nutzdaten nicht so mit Fremdschlüsseln vollzumüllen, die dann in den meisten Fällen doch überall Null sind. Aber das musst du entscheiden, ist ja auch nur eine erste Einschätzung, ohne alle relevanten Details zu kennen....
     
  5. Danke euch für die Antworten!
    @redJava99:
    - Wie kann ich denn dann z.B. das Speicher- Löschverhalten der Kinder beeinflussen? Kann ich das genauso machen wie bei verschiedenen Entitäten mit Angabe der Attribute orphanRemoval und cascade, oder kann Hibernate Kinder nicht erkennen, wenn sie sich in einer Tabelle mit den Eltern befinden?
    - Und muss ich die parentIds von Hand setzen, oder gibt es eine Möglichkeit diese von Hibernate generieren zu lassen? Gibt es eine Annotation, die Hibernate erkennen lässt, dass diese Liste Kindelemente enthält?

    @stg:
    - Auf welche Details würde es denn noch ankommen bei der Klärung einer solchen Frage?
    - Ich verstehe nicht ganz, was mit Join Tabellen gemeint ist? Ist damit gemeint, dass ich in einer Abfrage Joine? Dann müsste ich doch aber auch den Fremdschlüssel der jeweils anderen Entität in der Tabelle Speichern. Also für jede Entität, die mit Requirements in einer One-To-Many Beziehung steht eine eigene Spalte. Oder habe ich da falsch verstanden?
     
  6. stg
    stg
    Zum Beispiel wie komplex das Datenmodelltatsächlich ist. Was für Querys abgesetzt werden müssen. Wie oft wie viele Zugriff erfolgen werden. Was für Antowrtzeiten angestrebt werden...

    Ich meine nur, dass du den Fremdschlüssel nicht in der Tabelle "Requirements" stehen muss, sondern du diesen auch in eine gesonderte Tabelle auslagern kannst. Vielleicht ist dir nur ein anderer Name dafür geläufig, siehe zB hier: https://en.wikipedia.org/wiki/Junction_table

    Joins sind grunsätzlich erst einmal verhältnismäßig "teuer", dessen muss man sich bewuss sein. Bei kleineren Anwendung sind aber die meisten Performance-Gedanken verschwendete Zeit...
     
  7. orphanRemoval und cascade sollten auch bei Referenzen auf die gleiche Tabelle funktionieren, wenn ich mich nicht täusche. Gibt es Probleme, wenn du das verwendest?

    Was die Kind-/Parentbeziehung angeht: Wo ist hier das konkrete Problem? Hibernate wird für die Beziehung eine Beziehungstabelle anlegen (vermutlich 'chapter_subchapters') mit den id's der jeweiligen Entities.
    Dass die Subchapters "Kind"-Elemente eines Chapters sind, interessiert Hibernate eher wenig - das ist Teil deiner Programmlogik. Falls du auch in der Rückrichtung navigieren musst, kannst du das wahlweise über die Datenbank abhandeln oder durch ein zusätzliches Attribut 'parentChapter' (dann mit @ManyToOne, und festlegen welche der Beziehungen du nun tatsächlich persistieren willst (Stichwort 'mappedBy'...).
     
  8. @stg:
    Werden durch Hibernate nicht schon automatisch Junction Tables erzeugt, wenn ich nicht @JoinColumn bestimme?

    @redJava99:
    Ein Problem sehe ich da nicht wirklich, aber ich möchte so viel wie möglich aus der Hand legen. Beispielsweise frage ich mich, ob es möglich ist die ParentIds automatisch generieren zu lassen, sobald ich einem Chapter ein Subchapter hinzufüge, oder ob ich das in jedem Fall übernehmen muss.

     
  9. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!