Hi zusammen,
ich möchte mal nach einer Hilfestellungzur Modellierung meiner JPA-Entitäten und deren Beziehungen untereinander fragen. Ich verwende als Klassennamen in meinem Projekt abstraktere Klassennamen, sodass ich das mal auf ein "besser greifbares" Beispiel ummünze.
Ich gehe von einem Festival aus, auf dem mehrere Auftritte stattfinden. Jeder Auftritt ist dabei natürlich genau einem Festival zuzuordnen. Bei einem Auftritt werden mehrere Instrumente gespielt, dabei ist jedes Instrument einzigartig und genau einem Auftritt zuzuordnen. Ein Instrument wird nur von einem Musiker gespielt und ein Musiker spielt nur genau ein Instrument. Im Relationenmodell sehen die Beziehungen nun also so aus:
Die Klassen haben folgende JPA-Annotationen:
Das ganze habe ich mit einer REST-Schnittstelle versehen, die mir testweise angelegte Datenbankeinträge als JSON zurückliefert.
Problem 1: Bei der Beziehung zwischen Instrument<-->Musiker bin ich unsicher, ob 1:n oder 1:1, da bestimmte Musiker in anderen Auftritten auch andere Instrumente spielen.
Problem 2: Ich kann eine Veranstaltung wunderbar abfragen und sehe, welche Auftritte dazu gehören. Aber sobald ich einen bestimmten Auftritt abfrage, ist dort keine Information darüber, zu welcher Veranstaltung dieser gehört. Genau so verhält es sich mit Auftritte<-->Instrumente. Frage ich einen Auftritt ab, sehe ich welche Instrumente gespielt werden. Frage ich aber ein Instrument ab, sehe ich nicht,zu welchem konkreten Auftritt es gehört...dabei habe ich die Beziehungen ja bidirektional umgesetzt.
Nach JPA-Spezifikation ist die Many-Seite der Owner und die One-Seite die inverse Seite. Hier besteht das Problem also dabei, dass die Abfrage der Owner-Seite nicht die gewünschten Informationen liefert. Hoffe ist verständlich, ansonsten muss ich noch etwas mehr Code posten...
Gedankliche Hinweise?
Grüße
ich möchte mal nach einer Hilfestellungzur Modellierung meiner JPA-Entitäten und deren Beziehungen untereinander fragen. Ich verwende als Klassennamen in meinem Projekt abstraktere Klassennamen, sodass ich das mal auf ein "besser greifbares" Beispiel ummünze.
Ich gehe von einem Festival aus, auf dem mehrere Auftritte stattfinden. Jeder Auftritt ist dabei natürlich genau einem Festival zuzuordnen. Bei einem Auftritt werden mehrere Instrumente gespielt, dabei ist jedes Instrument einzigartig und genau einem Auftritt zuzuordnen. Ein Instrument wird nur von einem Musiker gespielt und ein Musiker spielt nur genau ein Instrument. Im Relationenmodell sehen die Beziehungen nun also so aus:
Die Klassen haben folgende JPA-Annotationen:
Java:
@Entity
public class Veranstaltung implements Serializable {
..
@OneToMany(mappedBy = "veranstaltung", cascade = CascadeType.ALL)
private List<Auftritt> auftritte;
..
}
@Entity
public class Auftritt implements Serializable {
..
@ManyToOne
private Veranstaltung veranstaltung;
@OneToMany(mappedBy = "auftritt", cascade = CascadeType.ALL)
private List<Instrument> instrumente;
..
}
@Entity
public class Instrument implements Serializable {
..
@ManyToOne(cascade = CascadeType.PERSIST)
private Auftritt auftritt;
..
}
Das ganze habe ich mit einer REST-Schnittstelle versehen, die mir testweise angelegte Datenbankeinträge als JSON zurückliefert.
Problem 1: Bei der Beziehung zwischen Instrument<-->Musiker bin ich unsicher, ob 1:n oder 1:1, da bestimmte Musiker in anderen Auftritten auch andere Instrumente spielen.
Problem 2: Ich kann eine Veranstaltung wunderbar abfragen und sehe, welche Auftritte dazu gehören. Aber sobald ich einen bestimmten Auftritt abfrage, ist dort keine Information darüber, zu welcher Veranstaltung dieser gehört. Genau so verhält es sich mit Auftritte<-->Instrumente. Frage ich einen Auftritt ab, sehe ich welche Instrumente gespielt werden. Frage ich aber ein Instrument ab, sehe ich nicht,zu welchem konkreten Auftritt es gehört...dabei habe ich die Beziehungen ja bidirektional umgesetzt.
Nach JPA-Spezifikation ist die Many-Seite der Owner und die One-Seite die inverse Seite. Hier besteht das Problem also dabei, dass die Abfrage der Owner-Seite nicht die gewünschten Informationen liefert. Hoffe ist verständlich, ansonsten muss ich noch etwas mehr Code posten...
Gedankliche Hinweise?
Grüße