H2 ManyToMany wie speichere ich die Daten?

ve987

Aktives Mitglied
Hallo, ich bin neu im Thema JPA und versuche gerade die bilaterale ManyToMany Beziehung mit Join Table zu verstehen und zu erstellen.
Ich habe schon mehrere Stunden damit verbracht, mehrere tutorials etc angeschaut und Stackoverflow gecheckt und brauche jetzt doch Eure Hilfe.

Zu meinem Code:
- Wir haben zwei entities: Employee (ist the owning side) und Telephone.
- Ein Employee kann mehrere Telephones haben und umgekehrt.
- Ich nutze die H2 Datenbank.
- Ich teste meinen Code mit Postman.

Mein Problem:
- Wenn ich ein Employee mit ein paar Telephones speichere -> alles wird in der Datenbank gespeichert und es gibt einen Eintrag in der dritten Tabelle: employee_telephone. Alles OK.
- Von der anderen Seite: Wenn ich ein Telephone mit ein paar Employees speichere, dann gibt es keinen Eintrag in der employee_telephone Tabelle. Es wird jedoch ein Employee in seiner Tabelle gespeichert und es werden Telephones in der eigenen Tabelle gespeichert.

Ich habe bei fast allen tutorials gesehen, dass die Daten von einer Seite in die Datenbank gespeichert werden:
Besitzer der Beziehung (owning side) + children entity. Also in meinem Fall ist das Employee mit Telephones.

Ebenso habe ich viel über die Extra Methoden gelesen, die man nutzen soll.
Ich rede hier über addTelephone(Telephone telephone) in der Employeee Klasse und addEmployee(Employee employee) in der Telephone Klasse. Ich weiß aber nicht wie ich diese Methoden in meinem Controller nutzen soll.

Wie es is eigentlich üblich?
SOLL man die Daten von beiden Seiten der ManyToMany Beziehung in der Datenbank speichern können?
Wenn Ja, wie kriege ich es hin?
Wenn nicht, wie kann ich es trotzdem machen bei child entity + parent entity?

Vielen Dank im Voraus für die Hilfe :)

[CODE lang="java" title="Employee Klasse"]@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
@ToString
public class Employee {

private String name;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "employee_telephone", joinColumns = @JoinColumn(name = "employee_id"), inverseJoinColumns = @JoinColumn(name = "telephone_id"))
Set<Telephone> telephones = new HashSet<>();

public void addTelephone(Telephone telephone) {
this.telephones.add(telephone);
telephone.getEmployees().add(this);
}
}
[/CODE]

[CODE lang="java" title="Telephone Klasse"]@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class Telephone {

private Integer number;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ManyToMany(mappedBy = "telephones", cascade = CascadeType.ALL)
Set<Employee> employees = new HashSet<>();

public void addEmployee(Employee employee) {
this.employees.add(employee);
employee.getTelephones().add(this);
}
}
[/CODE]

[CODE lang="java" title="Telephone Controller"]@RestController
public class TelephoneController {

TelephoneManager telephoneManager;
EmployeeManager employeeManager;

@Autowired
public TelephoneController(TelephoneManager telephoneManager, EmployeeManager employeeManager) {
this.telephoneManager = telephoneManager;
this.employeeManager= employeeManager;
}

@PostMapping("/telephones")
public Telephone addTelephone(@RequestBody Telephone telephone) {

Telephone telephone2 = new Telephone();
telephone2.setNumber(telephone.getNumber());
telephone2.setEmployees(telephone.getEmployees());
return telephoneManager.save(telephone2);
}
}[/CODE]

[CODE lang="java" title="Employee Controller"]@RestController
public class EmployeeController {

EmployeeManager employeeManager;

@Autowired
public EmployeeController(EmployeeManager employeeManager) {
this.employeeManager = employeeManager;
}

@PostMapping("/employees")
public Employee addEmployee(@RequestBody Employee employee) {
Employee employee2 = new Employee();
employee2.setName(employee.getName());
employee2.setTelephones(employee.getTelephones());

return employeeManager.save(employee);
}
}[/CODE]
Java:
 

ve987

Aktives Mitglied
Hi M.L., vielen Dank für die Links. Ja, ich habe auf diese Seiten bei der Recherche gestoßen.
Die Sache ist, alle zeigen, wie man die Beziehung setzen soll, aber keiner sagt, wie man die add-Methode im Controller aufbauen soll :(
 

ve987

Aktives Mitglied
M.L. könntest du / oder jemand anderer mir weiterhelfen? Ich komme leider nicht weiter und die Frage beschäftigt mich schon seit par Tagen :(
 

mihe7

Top Contributor
Einmal abgesehen davon, dass man ManyToMany meidet wie der Teufel das Weihwasser, habe ich das mal mit Hibernate nachgestellt und kann da ehrlich gesagt kein Problem finden.
 

ve987

Aktives Mitglied
Hi mihe7! Ohh 😳 das bedeutet, wenn du die POST Methode addTelephone(@RequestBody Telephone telephone) aus dem telephone controller nutzt und ein telephone mit ein paar employees speicherst, bekommst du einen Eintrag in die Join Table?

empl.JPGtel.JPGalles.JPG
Warum bekomme ich den nicht? 😢😢

Der Code dient nur zu Lernzwecken, ich möchte es gerne verstehen, wie es funktioniert.
 

mihe7

Top Contributor
Nein,, ich habe die ManyToMany-Geschichte nachgestellt. Da spielt es keine Rolle, welche Seite ich zuerst speichere.

Warte, ich häng Dir mal das Projekt dran. Der Code ist nicht schön und das Projekt ist jetzt für MySQL konfiguriert; für den Zweck reichts :)
 

Anhänge

  • jpa.zip
    5 KB · Aufrufe: 2

ve987

Aktives Mitglied
vielen Dank für deinen Code! Hmmm du hast ja eine schöne Methode addTicket(User user, Ticket ticket), die Sachen beiderseits speichert.. :) das ist schon was, was ich nicht habe. Ich habe zwar solche Methoden in Einzeklassen, aber die rufe ich ja gar nicht auf.. (weil ja ja nicht wusste wie :D ) ich muss ausprobieren, ob ich so was im controller hinkriegen kann...
 

mihe7

Top Contributor
So wie Du es oben hast, müsste es genauso funktionieren (so lange sich nicht Methoden endlos gegenseitig aufrufen). Das "Projekt" habe ich mal im Zusammenhang mit einer Frage hier im Forum erstellt (ist schon etwas her), ich hab das nur auf ManyToMany umgeschrieben und mir daher auch nur schnell die add-Methode hingeklatscht.
 

ve987

Aktives Mitglied
So ich probiere jetzt die add() Methoden im Controller zu unterbringen und tatsächlich: Eintrag in der Join Table ist da :)
Allerdings werden statt telephone und employees null Werte gespeichert :rolleyes::oops::confused: Ich probiere es weiter...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JPA TreeStruktur mit ManyToMany Relation Datenbankprogrammierung 2
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
Y @ManyToMany Sequence angeben möglich Datenbankprogrammierung 3
J Hibernate ManyToMany Cascade Datenbankprogrammierung 2
M JPA Annotations @ManyToMany + reihenfolge als key Datenbankprogrammierung 15
G Hibernate ManyToMany Verknüpfung Datenbankprogrammierung 3
byte [ Hibernate ] ManyToMany Datenbankprogrammierung 3
K Wie speichere ich das DB Passwort richtig ab? Datenbankprogrammierung 19
F MySQL Wie speichere ich Daten zeitlich abhängig? Datenbankprogrammierung 4
D Alte Daten ins neue Modell quetschen Datenbankprogrammierung 6
R Mongodb Daten werden immer überschrieben Datenbankprogrammierung 7
R Mongodb Daten in einem bestimmten Document speichern Datenbankprogrammierung 1
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
B Daten HSQL-DB Datenbankprogrammierung 2
thobren Projekt SQlite! Wie kann ich auf auf SQlite Daten zugreifen? Datenbankprogrammierung 4
OnDemand Daten verschlüsseln Datenbankprogrammierung 42
L Oracle Daten in Häppchen selektieren Datenbankprogrammierung 5
L Oracle Daten von Oracle zu MSSQL übertragen Datenbankprogrammierung 4
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
Z Ausgabe nur bestimmter Daten Datenbankprogrammierung 6
E netbeans - jsp Daten in Datenbank hinzufügen Datenbankprogrammierung 2
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Kirby.exe Vorschläge zur Verschlüsselung von Daten in der DB Datenbankprogrammierung 2
T Java Spiel Daten speichern Datenbankprogrammierung 1
LimDul H2 Embedded DB und Gigabytes an Daten Datenbankprogrammierung 0
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
R Wie mit zu viele Daten umgehen? Datenbankprogrammierung 2
T Oracle Normalisierung und Daten splitten Datenbankprogrammierung 1
JG12111989 DB-Daten werden falsch dargestellt Datenbankprogrammierung 7
K H2 Daten in die H2 console DB eintragen Datenbankprogrammierung 2
L SQLite Ändern der Daten in einem UNIQUE Feld Datenbankprogrammierung 1
S Daten von SQLite Datenbank nutzen Datenbankprogrammierung 5
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
L Oracle Daten von einem Server zum andere kopieren Datenbankprogrammierung 24
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
L MySQL Vergleichen von Array-Inhalt, Ausgabe gleicher Daten Datenbankprogrammierung 3
W Daten in Java intern abfragen Datenbankprogrammierung 1
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
I MySQL Datenbankstruktur angleichen - Daten behalten Datenbankprogrammierung 7
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
P LDAP: Daten eintragen funktioniert nicht Datenbankprogrammierung 7
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
O mit Multi-Thread Daten aus Datenbank lesen und schreiben Datenbankprogrammierung 22
F Daten verdichten Datenbankprogrammierung 0
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
B Daten aus DB in Word Dokument Datenbankprogrammierung 2
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
D Daten posten auf RestApi (Mongodb/NoSQL) Datenbankprogrammierung 0
I Fehler bei Ausgabe der Daten aus der DB Datenbankprogrammierung 3
OnDemand MySQL Daten aktualisieren Datenbankprogrammierung 6
D Daten von einem Server in eigenem Java-Programm benutzen Datenbankprogrammierung 6
M Vergleich von Daten in verschiedenen Tabellen Datenbankprogrammierung 1
S Daten aus Form in Datenbank nur einmal eintragen Datenbankprogrammierung 2
6 JBDC Daten verschlüsseln? Datenbankprogrammierung 2
F MySQL Daten ändern über Java Datenbankprogrammierung 3
G SQLite Daten aus SQLite DB in andere SQLite DB importieren Datenbankprogrammierung 4
H Grosse Menge an Daten in eine Datenbank Datenbankprogrammierung 32
M Daten nachträglich hinzufügen Datenbankprogrammierung 6
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
E Daten einer SQL-Datenbank aus Combobox in labels schreiben Datenbankprogrammierung 6
N HSQLDB Daten Auslesen Datenbankprogrammierung 3
O Viele Verbindungen-Exception bei insert Daten zur MySQL-Datenbank Datenbankprogrammierung 2
P MySql daten in leeren jtable übertragen Datenbankprogrammierung 5
SexyPenny90 SQL Daten sortieren und top 5 ausgeben Datenbankprogrammierung 7
L Hibernat will Daten nicht einfügen??? Datenbankprogrammierung 2
B MySQL DB Daten aktualisieren Datenbankprogrammierung 9
D MySQL Daten werden aus Datenbank gelesen, obwohl sie dort gar nicht angekommen sind Datenbankprogrammierung 8
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D Übersichtliche Zuweisung von Daten in Tabellen Datenbankprogrammierung 17
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
J Daten synchronisieren in Multi-Client-Anwendungen (Hibernate) Datenbankprogrammierung 6
S JPA: DB Schema ändern und Daten nicht verlieren - wie? Datenbankprogrammierung 5
T MySQL Select: Zusammenfassen von Daten und bilden von Durchschnitt? Datenbankprogrammierung 4
F Daten in die DB hinzufügen Datenbankprogrammierung 7
H Klasse welche Mysql Daten zurück gibt Datenbankprogrammierung 18
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
H Daten in/aus Datenbank schreiben Datenbankprogrammierung 2
M DropDownBoxen mit MySQL Daten füllen Datenbankprogrammierung 3
E MySQL Daten in die Datenbank eingeben via Java Programm Datenbankprogrammierung 3
F ORA 17410 Keine weiteren Daten aus Socket zu lesen Datenbankprogrammierung 2
B Daten aus Datenbank holen Datenbankprogrammierung 6
T Problem beim schreiben von daten Datenbankprogrammierung 4
N Daten aus Datenbank abfragen und anzeigen in der Praxis?? Datenbankprogrammierung 2
G MySQL Bekomme keine Daten. Datenbankprogrammierung 7
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
G Daten aggregieren Datenbankprogrammierung 11
Gossi Oracle 2 Daten (Datum) vergleichen Datenbankprogrammierung 6
W MySQL Daten aus bestimmter Spalte lesen Datenbankprogrammierung 2
E MySQL Befüllen einer MySQL DB mit großen Daten Datenbankprogrammierung 6
J Doppelte Daten in Spalte, nur die erste abrufen wie? Datenbankprogrammierung 15
P Daten aus MySql Datenbank lesen??? Datenbankprogrammierung 6
J Daten vergleichen Datenbankprogrammierung 10
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
X Daten einer DatenbankTabelle in JTable darstellen Datenbankprogrammierung 13
T Designfrage: DB-Daten direkt oder verzögert speichern Datenbankprogrammierung 2
Dragonfire Daten aus jsp Datei in datenbank speichern Datenbankprogrammierung 15
A Daten von Webshop einlesen Datenbankprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben