2009-11-25 22 views
43

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!

Respuesta

30

Debe configurar al empleado asociado en el vehículo antes de continuar con el empleado.

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

newEmployee.setVehicles(vehicles); 

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

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

+0

No creo que sea posible con JPA. También he usado Hibernate y si recuerdo correctamente eso es posible. – Bobby

+0

Gracias por señalar el problema en mi código original, lo he actualizado con la forma en que voy a resolverlo. – JMM

15

Una forma de hacerlo es establecer la opción de cascada en la que "uno" de la relación:

class Employee { 
    // 

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

    // 
} 

por esto, cuando se llama a

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

va a guardar los vehículos demasiado .

+0

Hola, gracias por la respuesta. Tengo el conjunto de cascadas donde me sugirió y los vehículos se guardan. Mi problema es que cuando se guardan los vehículos, quiero que su columna de clave externa employee_id contenga la identificación del empleado que acabo de guardar. – JMM

+1

Se supone que la clave externa debe guardarse en la cascada ... ¿podría enviar las anotaciones @OneToMany y @ManyToOne que está utilizando para verificar? Saludos cordiales Denes – user218435

+0

He actualizado mi publicación original para incluir las anotaciones. – JMM

Cuestiones relacionadas