假设我在 UserDAO 类中有这个:
@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
这是最佳做法还是我错过了什么?
答案 0 :(得分:3)
我更喜欢保存newVehicle
的直接方法(当然,在设置owner
属性之后)。
优点:
1)您的方法将强制框架检查用户的所有属性并将其写回DB,并且还将再次写入所有车辆。
2)它更具可读性,从某种意义上说,它更清楚你的意图只是添加一辆新车
3)如果您正在进行此更改,如果您使用EntityManager.getReference()
user
对象
答案 1 :(得分: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);
}
}
}
管理实体之外的关系会导致错误和重复的代码。