2009-11-25 153 views
43

也許這是一個愚蠢的問題,但它卻在擾亂我。JPA - 堅持一對多的關係

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

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

我的問題是,是否有可能讓車輛員工在員工本身持續存在的同時持續存在?我意識到員工需要先保存,然後再保存車輛。 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); 

更簡單,更清潔。謝謝大家的幫助!要做到這一點

回答

30

您必須先設置車輛上的相關員工,然後再保留員工。

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

newEmployee.setVehicles(vehicles); 

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 
+2

哦,好的。這樣可行。但我認爲可能有一種方法,我不必明確設置車輛上的相關員工? – JMM 2009-11-25 12:10:02

+0

我不認爲這是可能的與JPA。我也使用了Hibernate,如果我沒有記錯的話,那是可能的。 – Bobby 2009-11-25 12:16:33

+0

感謝您在我的原始代碼中指出問題,我已經用我將如何解決問題進行了更新。 – JMM 2009-11-25 12:33:04

15

一種方法是級聯選項的設置「一」關係的一面:

class Employee { 
    // 

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

    // 
} 

通過這一點,當你調用

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

這將節省車輛太。

+0

嗨,感謝您的回覆。我確實在你建議的地方設置了級聯,車輛也得到保存。我的問題是,當車輛保存時,我希望他們的外鍵列employee_id包含我剛剛保存的員工的ID。 – JMM 2009-11-25 09:42:42

+1

外鍵應該保存在級聯中......你能發送@OneToMany和@ManyToOne註釋來檢查嗎? 最好的問候 Denes – user218435 2009-11-25 11:45:24

+0

我已更新我的原始文章以包含註釋。 – JMM 2009-11-25 11:56:39