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);
Гораздо проще и чище. Спасибо за вашу помощь всем!
Ответы
Ответ 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);
он также сохранит транспортные средства.