Hibernate Umsetzung multiple OneToMany Beziehung

denis7788

Bekanntes Mitglied
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?
 

stg

Top Contributor
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....
 

denis7788

Bekanntes Mitglied
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?
 

stg

Top Contributor
D
- Auf welche Details würde es denn noch ankommen bei der Klärung einer solchen Frage?
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 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?

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...
 

redJava99

Bekanntes Mitglied
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'...).
 

denis7788

Bekanntes Mitglied
@stg:
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.
Werden durch Hibernate nicht schon automatisch Junction Tables erzeugt, wenn ich nicht @JoinColumn bestimme?

@redJava99:
Was die Kind-/Parentbeziehung angeht: Wo ist hier das konkrete Problem?
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.

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'...)./QUOTE]
Zum Verständnis: Also in der Entity Klasse Chapter ein zusätzlichen Attribut "ParentChapter" mitgeben und mit @ManyToOne annotieren. Bei mappedBy hakt es bei mir. Ich müsste doch mit der Klasse selbst mappen, also mappedBy="Chapter"?
 

Ähnliche Java Themen


Oben