1

假设我在我的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

这是最佳做法还是我错过了什么?

4

2 回答 2

3

我更喜欢直接保存的方法newVehicle(当然,在设置owner属性之后)。

优点:

1)您的方法将强制框架检查用户的所有属性并将它们写回数据库,并且还将再次写入所有车辆。

2)它更具可读性,因为它更清楚地表明您的意图只是添加一辆新车

3)如果你正在做这个改变,你甚至可能不需要user从数据库中检索对象,如果你使用EntityManager.getReference()

于 2013-02-26T16:29:03.603 回答
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);
        }
    }
}

管理实体外部的关系会导致错误和重复代码。

于 2013-02-26T16:29:22.007 回答