これはばかげた質問かもしれませんが、私を悩ませています。
従業員と車両の双方向の1対多の関係があります。従業員を初めてデータベースに永続化するとき(つまり、IDが割り当てられていないとき)、関連するVehiclesも永続化する必要があります。
現時点では、保存されたVehicleエンティティが関連付けられたEmployeeを自動的にマップしておらず、Vehicleテーブルのemployee_id外部キー列が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);
はるかにシンプルでクリーン。皆様のご協力に感謝します!
Employeeを永続化する前に、VehicleにrelatedEmployeeを設定する必要があります。
Employee newEmployee = new Employee("matt");
vehicle1.setAssociatedEmployee(newEmployee);
vehicles.add(vehicle1);
newEmployee.setVehicles(vehicles);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
それを行う1つの方法は、リレーションシップの「一方」側にカスケードオプションを設定することです。
class Employee {
//
@OneToMany(cascade = {CascadeType.PERSIST})
private Set<Vehicles> vehicles = new HashSet<Vehicles>();
//
}
これにより、あなたが電話するとき
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
車両も節約できます。