3

User エンティティと Department エンティティがあります

私はそれらの間に @manyToMany 関係を持ちたい:

多くのユーザーが多くの部門を持つことができます。

私のユーザーエンティティで:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "UserDepartments", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "department_id", referencedColumnName = "id") })
private Set<Department> departments;

私のDepartmentエンティティには、ユーザーのSETもあります..

私の質問は:

メソッドを実装する必要がある場合:

public void removeUserFromDepartment(User user, Department department) {
      //bla bla
}

電話する必要がありますか

department.getUserCollection.remove(user);

user.getDepartmentCollection.remove(department);

または、それらの1つだけを削除してこのロジックを維持する方法はありますか?

両方を保存する必要がある場合、特に2つのエンティティの多対多の関係を知らない人にとっては、維持するのがかなり難しい..

4

1 に答える 1

2

OneToManyorリレーションシップが JPA に存在する場合ManyToMany、クライアント コードはリレーションシップの管理を担当します。これは、関係の両側からオブジェクトを明示的に削除する必要があることを意味します。

Userインスタンスがあり、部門を削除する必要があるとします。

User user = dao.findUser(1L); //Find a user, psuedo code
Department dept = user.getDepartments().get(0);
dept.getUsers().remove(user);
user.getDepartments().remove(user);
dao.update(user); //once again psuedo code

上記のコードを使用するには、カスケード タイプをユーザー エンティティの関係に追加する必要があります。

@ManyToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
@JoinTable(name = "UserDepartments", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "department_id", referencedColumnName = "id") })
private Set<Department> departments;

これにより、エンティティの保存がUserエンティティにカスケードされDepartmentsます。リマインダーの保存は疑似コードであり、 や などの呼び出しに要約されEntityManagerます。persistmerge

于 2013-08-14T08:52:15.527 に答える