83 Stimmen

JPA - Persistieren einer One-to-Many-Beziehung

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!

63voto

Bobby Punkte 1521

Sie müssen den assoziierten Mitarbeiter auf das Fahrzeug setzen, bevor Sie den Mitarbeiter persistieren.

Employee newEmployee = new Employee("matt");
vehicle1.setAssociatedEmployee(newEmployee);
vehicles.add(vehicle1);

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

33voto

user218435 Punkte 241

Eine Möglichkeit, dies zu tun, besteht darin, die Option "Kaskade" auf der Seite "Eine" der Beziehung einzustellen:

class Employee {
   // 

   @OneToMany(cascade = {CascadeType.PERSIST})
   private Set<Vehicles> vehicles = new HashSet<Vehicles>();

   //
}

dadurch, dass Sie beim Aufruf von

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

es wird auch die Fahrzeuge retten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X