unidirectional onetomany one many example java jpa orm one-to-many

java - onetomany - JPA-Persistiendo en una relación de Uno a Muchos



one to many jpa hibernate (2)

Debe configurar al Empleado asociado en el Vehículo antes de persistir en el Empleado.

Employee newEmployee = new Employee("matt"); vehicle1.setAssociatedEmployee(newEmployee); vehicles.add(vehicle1); newEmployee.setVehicles(vehicles); Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

Tal vez esta es una pregunta estúpida, pero me está molestando.

Tengo una relación uno a uno bidireccional 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 del vehículo no está mapeando automáticamente al empleado asociado, 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 persiste el 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: según lo solicitado, aquí están 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 di cuenta de que debería haber definido el siguiente método en mi clase Empleado:

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!


Una forma de hacerlo es establecer la opción de cascada en su lado "Uno" de la relación:

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

por esto, cuando llamas

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

también salvará los vehículos.