Peut-être que c'est une question stupide mais ça m'embête.JPA - Persistance d'une relation de un à plusieurs
J'ai une relation un-à-plusieurs bidirectionnelle de l'employé aux véhicules. Lorsque je persiste un employé dans la base de données pour la première fois (c'est-à-dire qu'il n'a pas d'ID attribué), je souhaite également que ses véhicules associés soient conservés. Cela fonctionne très bien pour moi à l'heure actuelle, sauf que mon entité Vehicle enregistrée n'obtient pas l'employé associé automatiquement mappé, et dans la base de données la colonne de clé étrangère employee_id dans la table Vehicle est null.
Ma question est la suivante: est-il possible de faire en sorte que l'employé du véhicule continue de travailler en même temps que l'employé lui-même? Je me rends compte que l'employé devrait être sauvé d'abord, puis le véhicule sauvé par la suite. Est-ce que JPA peut le faire automatiquement pour moi? Ou dois-je faire quelque chose comme ce qui suit:
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 correspondances (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 eu la méthode suivante définie dans ma classe d'employés:
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!
Ooh, ok. Ça marche. Mais je pensais qu'il pourrait y avoir un moyen par lequel je n'ai pas à expliquer explicitement l'employé associé sur le véhicule? – JMM
Je ne pense pas que ce soit possible avec JPA. J'ai aussi utilisé Hibernate et là si je me souviens bien c'est possible. – Bobby
Merci d'avoir signalé le problème dans mon code d'origine, je l'ai mis à jour avec la façon dont je vais le résoudre. – JMM