JPA – Persistance d’une relation un à un

Peut-être que c’est une question stupide, mais ça m’énerve.

J’ai une relation bidirectionnelle entre un employé et un véhicule. Lorsque je persiste un employé dans la firebase database pour la première fois (c.-à-d. Qu’il n’a pas d’ID assigné), 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é de véhicule enregistrée ne mappe pas automatiquement l’employé associé et que la colonne de clé étrangère employee_id de la table Vehicle est nulle dans la firebase database.

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 est persistant? Je me rends compte que l’employé devrait être sauvé en premier, puis le véhicule sauvegardé par la suite. Est-ce que JPA peut le faire automatiquement pour moi? Ou dois-je faire quelque chose comme ceci:

Vehicle vehicle1 = new Vehicle(); Set vehicles = new HashSet(); 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 cartographies (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 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û avoir la méthode suivante définie sur 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!

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

 Employee newEmployee = new Employee("matt"); vehicle1.setAssociatedEmployee(newEmployee); vehicles.add(vehicle1); newEmployee.setVehicles(vehicles); Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

Une façon de le faire est de définir l’option en cascade sur votre “côté” de la relation:

 class Employee { // @OneToMany(cascade = {CascadeType.PERSIST}) private Set vehicles = new HashSet(); // } 

par cela, quand vous appelez

 Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

cela sauvera les véhicules aussi.