簡體   English   中英

JPA - 保持一對多的關系

[英]JPA - Persisting a One to Many relationship

也許這是一個愚蠢的問題,但它困擾着我。

我有員工與車輛的雙向一對多關系。 當我第一次將 Employee 持久化到數據庫中時(即它沒有分配的 ID),我也希望其關聯的 Vehicles 被持久化。

目前這對我來說很好用,除了我保存的 Vehicle 實體沒有自動獲取關聯的 Employee 映射,並且在數據庫中,Vehicle 表中的 employee_id 外鍵列為空。

我的問題是,是否有可能在堅持員工本身的同時堅持車輛的員工? 我意識到需要先保存 Employee ,然后再保存 Vehicle 。 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 newEmployee = new Employee("matt");
vehicle1.setAssociatedEmployee(newEmployee);
vehicles.add(vehicle1);

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

一種方法是在關系的“一方”上設置級聯選項:

class Employee {
   // 

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

   //
}

通過這個,當你打電話

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);

它也將節省車輛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM