Vielleicht ist das eine dumme Frage, aber sie stört mich.
Ich habe ein bidirektionales Verhältnis von Mitarbeiter zu Fahrzeugen. Wenn ich einen Mitarbeiter zum ersten Mal in der Datenbank persistiere (d.h. er hat keine zugewiesene ID), möchte ich, dass auch die zugehörigen Fahrzeuge persistiert werden.
Dies funktioniert gut für mich im Moment, außer dass meine gespeicherte Fahrzeug-Entität nicht immer die zugehörige Mitarbeiter automatisch zugeordnet, und in der Datenbank die employee_id Fremdschlüssel Spalte in der Tabelle Fahrzeug ist null.
Meine Frage ist, ist es möglich, den Mitarbeiter des Fahrzeugs zur gleichen Zeit der Mitarbeiter selbst persistiert wird? Mir ist klar, dass zuerst der Mitarbeiter und danach das Fahrzeug gespeichert werden müsste. Kann JPA dies automatisch für mich tun? Oder muss ich etwas wie das Folgende tun:
Vehicle vehicle1 = new Vehicle();
Set<Vehicle> vehicles = new HashSet<Vehicle>();
vehicles.add(vehicle1);
Employee newEmployee = new Employee("matt");
newEmployee.setVehicles(vehicles);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
vehicle1.setAssociatedEmployee(savedEmployee);
vehicleDao.persistOrMerge(vehicle1);
Gracias.
Edit: Wie gewünscht, hier meine Mappings (ohne die anderen Methoden etc.)
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="employee_id")
private Long id;
@OneToMany(mappedBy="associatedEmployee", cascade=CascadeType.ALL)
private Set<Vehicle> vehicles;
...
}
@Entity
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="vehicle_id")
private Long id;
@ManyToOne
@JoinColumn(name="employee_id")
private Employee associatedEmployee;
...
}
Mir ist gerade klar geworden, dass ich die folgende Methode in meiner Employee-Klasse hätte definieren müssen:
public void addVehicle(Vehicle vehicle) {
vehicle.setAssociatedEmployee(this);
vehicles.add(vehicle);
}
Der obige Code sieht nun wie folgt aus:
Vehicle vehicle1 = new Vehicle();
Employee newEmployee = new Employee("matt");
newEmployee.addVehicle(vehicle1);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
Viel einfacher und sauberer. Vielen Dank für Ihre Hilfe!