1

CascadeType.ALL関連付けを伴うJPA の動作について、いくつかの疑問があり@ManyToManyます。次のシナリオがあります。

横にs とs の@ManyToMany間に関連があります。EmployeeDepartmentCascadeType.ALLEmployee

同じ部署に所属する 2 人の従業員を作成する場合

Department sales = new Department("sales");
Employee alice = new Employee("alice", sales);
Employee bob = new Employee("bob", sales);

そして、私はそれらを永続化します。カスケードにより、部門は期待どおりに永続化されます。

alice次に、とを 1 つずつ削除しbobます。私が削除aliceするEmployeeと削除されますが、営業部門は変更されません。

しかし、削除するとbob(後alice)、営業部門は自動的に削除されます。

何故ですか?を削除したときに部門を削除しようとしなかったのはなぜaliceですか? 私はそれを期待していたでしょう!

ありがとう!

4

2 に答える 2

0

エンティティは存在しないエンティティを参照できないことが期待されます。したがって、JPA期待どおりに機能する場合は、削除後、Alice削除前にBob、後者は存在しない部門を参照します。

于 2012-09-12T16:19:18.697 に答える
0

の削除は、トランザクションの最後まで延期される可能性があります。そのため、同じトランザクションでDepartment両方の を削除すると、この動作が観察されます。Employee

トランザクションごとに の 1つだけを削除しようとすると、Employeeコミット中に一定の違反エラーが発生するはずです (ON DELETE CASCADEデータベース スキーマに似たようなものがない限り)。これは、Hibernate がDepartmentこの時点で実際に削除するためです。

CascadeType.ALLまた、そのような関係で使用するのは合理的な考えではないと思います。論理的にEmployeeその を所有していないDepartmentため、説明目的でのみ使用していると思います。

于 2012-09-12T16:30:42.033 に答える