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!
Ooh, ok. Che funzioni. Ma ho pensato che potrebbe esserci un modo in cui non devo necessariamente impostare il dipendente associato sul veicolo? – JMM
Non penso che sia possibile con JPA. Ho anche usato Hibernate e lì, se ricordo bene, è possibile. – Bobby
Grazie per aver segnalato il problema nel mio codice originale, l'ho aggiornato con il modo in cui lo risolverò. – JMM