使用Spring将JPA / Hibernate添加到用户的最简单方法

时间:2013-02-26 16:21:18

标签: java spring hibernate jpa

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

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

2 个答案:

答案 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);
        }
    }
}

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