2009-11-25 16 views
43

Forse questa è una domanda stupida ma mi disturba.JPA - Persistere una relazione uno a molti

Ho una relazione bidirezionale tra dipendenti e veicoli. Quando continuo un Dipendente nel database per la prima volta (cioè non ha ID assegnato) voglio anche che i suoi veicoli associati siano persistenti.

Questo al momento funziona, ad eccezione del fatto che all'entità veicolo salvata non viene assegnato automaticamente il dipendente associato mappato e nel database la colonna chiave foreign_id nella tabella Veicolo è nullo.

La mia domanda è, è possibile mantenere il dipendente del Veicolo persistente nello stesso momento in cui il Dipendente stesso viene mantenuto? Mi rendo conto che il Dipendente dovrebbe prima essere salvato, quindi il Veicolo salvato in seguito. JPA può farlo automaticamente per me? O devo fare qualcosa di simile al seguente:

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

Grazie!

Edit: Come richiesto, ecco la mia mappature (senza tutti gli altri metodi, ecc)

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

    ... 
} 

Ho appena realizzato che avrebbe dovuto avere il seguente metodo definito sulla mia classe Employee:

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

Ora il codice di cui sopra sarà simile a questa:

Vehicle vehicle1 = new Vehicle(); 

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

Molto più semplice e più pulito. Grazie per il tuo aiuto a tutti!

risposta

30

È necessario impostare il dipendente associato sul veicolo prima di mantenere il dipendente.

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

newEmployee.setVehicles(vehicles); 

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 
+2

Ooh, ok. Che funzioni. Ma ho pensato che potrebbe esserci un modo in cui non devo necessariamente impostare il dipendente associato sul veicolo? – JMM

+0

Non penso che sia possibile con JPA. Ho anche usato Hibernate e lì, se ricordo bene, è possibile. – Bobby

+0

Grazie per aver segnalato il problema nel mio codice originale, l'ho aggiornato con il modo in cui lo risolverò. – JMM

15

Un modo per farlo è quello di impostare l'opzione a cascata su di voi "un" lato di relazione:

class Employee { 
    // 

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

    // 
} 

da questo, quando si chiama

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

sarà salvare i veicoli troppo .

+0

Ciao, grazie per la risposta. Ho il set a cascata dove hai suggerito e i veicoli vengono salvati. Il mio problema è che quando i veicoli vengono salvati, voglio che la loro colonna chiave esterna employee_id contenga l'id del dipendente che ho appena salvato. – JMM

+1

La chiave esterna deve essere salvata nella cascata ... è possibile inviare le annotazioni @OneToMany e @ManyToOne che si stanno utilizzando per il controllo? Cordiali saluti Denes – user218435

+0

Ho aggiornato il mio post originale per includere le annotazioni. – JMM

Problemi correlati