web-dev-qa-db-ja.com

JPA-1対多の関係を維持する

これはばかげた質問かもしれませんが、私を悩ませています。

従業員と車両の双方向の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);

はるかにシンプルでクリーン。皆様のご協力に感謝します!

52
JMM

Employeeを永続化する前に、VehicleにrelatedEmployeeを設定する必要があります。

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

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
38
Bobby

それを行う1つの方法は、リレーションシップの「一方」側にカスケードオプションを設定することです。

class Employee {
   // 

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

   //
}

これにより、あなたが電話するとき

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

車両も節約できます。

17
user218435