2013-02-26 76 views
1

增加車輛以用戶使用JPA /休眠比方說,我在UserDAO的類有這樣的:最簡單的方法使用Spring

@OneToMany(cascade=CascadeType.ALL, mappedBy="owner", fetch=FetchType.EAGER,   orphanRemoval=true) 
private Set<Vehicle> vehicles = new HashSet<Vehicle>(); 

這是一個新的車輛添加到用戶的推薦方式:

User user = userService.findByLoginName("MartinL"); 
Vehicle newVehicle = new Vehicle(); 
newVehicle.set(...) // setters omitted 
newVehicle.setOwner(user) // is this needed in any case? 
user.getVehicles().add(newVehicle) // add the new vehicle to the Set in User class 
userService.save(user); // persist the modified user object to database 

這是對最佳實踐還是我錯過什麼嗎?

回答

3

我更喜歡直接保存newVehicle(當然在設置owner屬性後)。

優點:

1)你的做法將迫使框架來檢查用戶的所有屬性,並將它們寫回的DB,也將再次寫入所有的車輛。

2)它是更具可讀性,因爲它使更清楚地表明你的意圖僅僅是添加新的車輛感

3)如果你正在做的這個變化,你可能甚至不需要檢索user數據庫中的對象,如果使用EntityManager.getReference()

3

您通常希望管理關係的(JPA定義的)相關方和相關類內的雙向關聯。僞代碼:

class User { 
    private Set<Vehicle> vehicles; 

    public void addVehicle(Vehicle vehicle) { 
     if(vehicle == null) return; 

     vehicle.setOwner(this); 
     vehicles.add(vehicle); 
    } 

    public void removeVehicle(Vehicle vehicle) { 
     if(vehicle == null) return; 

     if(vehicles.remove(vehicle)) { 
      vehicle.setOwner(null); 
     } 
    } 
} 

管理實體之外的關係會導致錯誤和重複的代碼。

+0

@JBNizet - true。儘管我總是討厭倒向的,面向數據庫的術語。將更新答案。 – Perception 2013-02-26 16:35:14

+0

我有一個'UserService'類,它調用UserRepository類(從'JpaRepository'繼承)中的持久性方法。我的User類是一個獨立的類,位於.domains包內。由於我是java新手:當我的業務邏輯位於** Service **內部並且我有單獨的Data類時,您的建議如何適用於此場景?換句話說:我如何將我的User對象傳遞給我的Service類? – 2013-02-26 17:03:23

+0

@MartinLundberg - 我認爲這是一個不相關的(也有點模糊的)問題。如果你做了另一個SO帖子,可能最好,代碼清楚地說明你正在嘗試做什麼。 – Perception 2013-02-26 17:12:24