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)あなたのアプローチは、フレームワークにユーザーのすべての属性をチェックさせ、それらをDBに書き戻し、すべての車両を再度書き込みます。

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 に答える