66

多分これはばかげた質問ですが、それは私を悩ませています。

私は、従業員と車両の双方向の1対多の関係を持っています。従業員をデータベースに初めて永続化するとき(つまり、IDが割り当てられていないとき)、関連する車両も永続化する必要があります。

保存した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);

はるかにシンプルでクリーン。みなさん、ありがとうございました!

4

2 に答える 2

52

従業員を永続化する前に、車両に関連する従業員を設定する必要があります。

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

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
于 2009-11-25T12:03:22.760 に答える
24

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

class Employee {
   // 

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

   //
}

これで、あなたが電話するとき

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

車両も節約できます。

于 2009-11-25T09:32:18.647 に答える