web-dev-qa-db-fra.com

JPA - Persister dans une relation un à plusieurs

C'est peut-être une question stupide, mais ça me dérange.

J'ai une relation bidirectionnelle un à plusieurs entre l'employé et les véhicules. Lorsque je persiste un employé dans la base de données pour la première fois (c'est-à-dire sans ID attribué), je souhaite également que ses véhicules associés soient conservés.

Cela fonctionne très bien pour moi pour le moment, sauf que mon entité Vehicle enregistrée ne reçoit pas automatiquement le mappage employé associé, et dans la base de données, la colonne de clé étrangère employee_id dans la table Vehicle est nulle.

Ma question est la suivante: est-il possible que l'employé du véhicule persiste en même temps que l'employé lui-même persiste? Je me rends compte que l'employé devrait être sauvé d'abord, puis le véhicule sauvé ensuite. JPA peut-il le faire automatiquement pour moi? Ou dois-je faire quelque chose comme ceci:

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);

Merci!

Edit: comme demandé, voici mes mappages (sans toutes les autres méthodes, 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;

    ...
}

Je viens de réaliser que j'aurais dû définir la méthode suivante dans ma classe Employé:

public void addVehicle(Vehicle vehicle) {
    vehicle.setAssociatedEmployee(this);
    vehicles.add(vehicle);
}

Maintenant, le code ci-dessus ressemblera à ceci:

Vehicle vehicle1 = new Vehicle();

Employee newEmployee = new Employee("matt");
newEmployee.addVehicle(vehicle1);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

Beaucoup plus simple et plus propre. Merci pour votre aide tout le monde!

52
JMM

Vous devez définir l'employé associé sur le véhicule avant de faire persister l'employé.

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

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
38
Bobby

Une façon de le faire est de définir l'option en cascade sur votre côté "Un" de la relation:

class Employee {
   // 

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

   //
}

par cela, lorsque vous appelez

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

cela sauvera aussi les véhicules.

17
user218435