Подтвердить что ты не робот

JPA - сохранение отношения от одного до большого

Возможно, это глупый вопрос, но это меня подслушивает.

У меня двунаправленное отношение многих сотрудников к транспортным средствам. Когда я впервые сохраняю Работника в базе данных (т.е. У него нет назначенного идентификатора), я также хочу, чтобы его связанные Транспортные средства сохранялись.

В настоящее время это отлично работает для меня, за исключением того, что мой сохраненный объект Vehicle не получает связанный с ним Employee, а в базе данных столбец Foreign_ employee_id в таблице Vehicle равен null.

Мой вопрос: возможно ли, чтобы работник транспортного средства сохранялся в то же время, что сам Сотрудник сохраняется? Я понимаю, что сначала необходимо сохранить Работника, а затем сохранить его. Может ли JPA сделать это автоматически для меня? Или мне нужно сделать что-то вроде следующего:

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

Спасибо!

Изменить: в соответствии с запросом здесь мои сопоставления (без всех других методов и т.д.)

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

    ...
}

Я просто понял, что должен был иметь следующий метод, определенный в моем классе Employee:

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

Теперь код выше будет выглядеть следующим образом:

Vehicle vehicle1 = new Vehicle();

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

Гораздо проще и чище. Спасибо за вашу помощь всем!

4b9b3361

Ответ 1

Вы должны установить связанный с ним сотрудник на транспортном средстве, прежде чем продолжать работу сотрудника.

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

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

Ответ 2

Один из способов сделать это - установить параметр каскада на стороне "Один":

class Employee {
   // 

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

   //
}

этим, когда вы вызываете

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

он также сохранит транспортные средства.