0

私は 2 つのエンティティを持っています: 1) ユーザー 2) 部門。

それらの間の関係はmanyToManyであるため、それぞれに他のSETが含まれています。

ユーザーエンティティと部門エンティティで (CascadeType.ALL) をマークしました。

userX.getDepartments.remove(departmentX);
save(userX);

意図したとおりに機能します-実際にはそれを意味します

departmentX.getUsers.contains(userX) == false.

暗黙的に呼び出されます。

しかし、私がするとき

departmentY.getUsers.remove(userX);
save(departmentY); 

カスケードしません!意味 - 私はできる

userX.getDepartments.contains(departmentY) == true 

カスケードがすべて一方向にしか機能しない理由はありますか? 解決策はありますか?

ありがとう

4

1 に答える 1

1

カスケードは、あなたがしていることとは無関係です。カスケードとは、X を保存するときに Y も保存することを意味します。

ManyToMany の双方向の関連付けがあります。関連付けの所有者側はユーザーです。これは、コレクションに対するすべての変更がUser.departmentsデータベースに保存されることを意味します。反対側(Department.users)は逆側です。これは、へのすべての変更がDepartment.usersHibernate によって無視されることを意味します。

所有者側で操作を実行し、できれば関連付けの両側を一貫した状態に維持するのはあなたの責任です。ユーザーが部門から削除された場合は、部門もユーザーから削除する必要があり、その逆も同様です。 . ただし、Hibernate は両側が一貫した状態にあるかどうかを気にしません。アソシエーションの所有者側 (mappedBy属性を持たない側) の状態を保持します。

于 2013-08-14T14:14:47.287 に答える