Quizás esta es una pregunta estúpida pero me está molestando.JPA - Persistiendo en una relación de Uno a Muchos
Tengo una relación bidireccional uno a muchos de empleado a vehículos. Cuando persisto a un Empleado en la base de datos por primera vez (es decir, no tiene una ID asignada), también deseo que se mantengan sus Vehículos asociados.
Esto funciona bien para mí en este momento, excepto que mi entidad guardada no obtiene el empleado asociado mapeado automáticamente, y en la base de datos la columna clave externa employee_id en la tabla Vehículo es nula.
Mi pregunta es, ¿es posible que el empleado del vehículo persista al mismo tiempo que se persiste al empleado? Me doy cuenta de que el empleado necesitaría ser salvado primero, luego el vehículo se guardará después. ¿Puede JPA hacer esto automáticamente por mí? O tengo que hacer algo como lo siguiente:
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);
Gracias!
Editar: Conforme a lo solicitado, he aquí mis asignaciones (sin todos los demás métodos 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;
...
}
Me acabo de dar cuenta que debería haber tenido el siguiente método definido en mi clase Employee:
public void addVehicle(Vehicle vehicle) {
vehicle.setAssociatedEmployee(this);
vehicles.add(vehicle);
}
Ahora el código anterior se verá así:
Vehicle vehicle1 = new Vehicle();
Employee newEmployee = new Employee("matt");
newEmployee.addVehicle(vehicle1);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
mucho más simple y más limpio. ¡Gracias por su ayuda a todos!
Ooh, ok. Eso funciona. Pero pensé que podría haber una forma en la que no tenga que establecer explícitamente al empleado asociado en el vehículo. – JMM
No creo que sea posible con JPA. También he usado Hibernate y si recuerdo correctamente eso es posible. – Bobby
Gracias por señalar el problema en mi código original, lo he actualizado con la forma en que voy a resolverlo. – JMM