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]
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: