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

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 😀 ) ich muss ausprobieren, ob ich so was im controller hinkriegen kann...
 
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.
 
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 🙄😳😕 Ich probiere es weiter...
 

Zurück
Oben