2009-11-25 4 views
43

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!

Répondre

30

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

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

+0

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

+0

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

15

Une façon de le faire est de définir l'option en cascade sur vous « un » côté 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); 

il permettra d'économiser les véhicules trop .

+0

Salut, merci pour la réponse. J'ai la cascade définie où vous avez suggéré et les véhicules sont sauvés. Mon problème est que lorsque les véhicules sont enregistrés, je veux que leur colonne de clé étrangère employee_id contienne l'identifiant de l'employé que je viens d'enregistrer. – JMM

+1

La clé étrangère est supposée être sauvegardée dans la cascade ... pourriez-vous envoyer les annotations @OneToMany et @ManyToOne que vous utilisez pour vérifier? Meilleures salutations Denes – user218435

+0

J'ai mis à jour mon message original pour inclure les annotations. – JMM

Questions connexes