3

Hibernate EntitiesCascadeの関連付けの両側で使用するのは適切ですか? ManyToOne私の質問をより具体的にするために、誰かが次の関連エンティティを持っていると仮定しましょう:

   public class Department
    {
    public long id;

    @OneToMany(mappedBy = "department", cascade=cascadeType.REMOVE)
    private Set<Employee> employees;
    }

    public class Employee{

    @GeneratedValue(strategy=GeneratedValue.identity)
    public longempid;

    @ManyToOne
    public Department department;
    }

上記の関係では、 aDepartmentには多くのがあるため、 a が削除されたときにEmployeesを強制的に削除するのが合理的です。私は正しいですか?EmployeesDepartment

ただし、関係の所有者はEmployee. したがって、私の質問は、cascadeType.PERSIST. 特別なニーズに応じて、両面のどちらかを選択できますか、それとも両方に配置できますか? 横に置いた場合、 がリレーションの所有者であることを考慮してDepartment、次のコードは も保存しますか?EmployeesEmployee

Employee e1 = new Employee();
Employee e2 = new Employee();
Department d = new Department();
d.getEmployees.add(e1);
d.getEmployees.add(e2);
em.persist(d);

cascadeType.PERSISTを横に置くと、逆のことがほぼ確実に機能しEmployeeます( を保存すると、 もEmployee保存Departmentされます)。

4

1 に答える 1

4

まず、投稿されたコードでは、従業員は協会の所有者ではありません。アソシエーションが双方向で、OneToMany アソシエーションがmappedBy属性で定義されている場合は、次のようになります。

@OneToMany(mappedBy = "department", cascade = cascadeType.REMOVE)
private Set<Employee> employees;

(フィールドをプライベートにしたことに注意してください。パブリック フィールドは使用しないでください)。

部署の削除について: 私の会社では、部署が削除されても、そのすべての従業員が自動的に解雇されるわけではありません。それらは別の部門に割り当てられるか、部門に影響されずに会社にとどまる可能性がありますが、削除されません。アプリケーションが必ずしも現実の世界をモデル化していないことは理解していますが、いいえ、部門が削除されたときに従業員を強制的に削除することは必ずしも合理的ではありません。

ここで、マッピングが上記のようになっていると仮定すると、はい、OneToMany アソシエーションに PERSIST カスケードを完全に追加できます。カスケードと所有権は直交する概念です。persist()操作を部門からその従業員にカスケードする場合 (つまり、部門の作成時に従業員を作成する場合)、このカスケードを追加します。ただし、関連付けを保存するには、所有者側が従業員であるため、employee.department フィールドを正しく初期化する必要があります。

于 2013-05-19T17:08:29.747 に答える