1

UserとDepartmentの2つのエンティティがあります。2つのエンティティ(OneToManyとManyToOne)の間には双方向の関係があり、次のように部門へのユーザーの削除と追加を処理するサービスクラスで関係を管理します。

List<User> originalUserList = userJpaRepository.findAllByDepartment(department);
for (Iterator<User> iterator = originalUserList.iterator(); iterator.hasNext();) {
    User user = iterator.next();
    if (!department.getDepartmentEmployees().contains(user)) {
        user.setDepartment(null);
        userJpaRepository.save(user);
    }
}
for (User user : department.getDepartmentEmployees()) {
    user.setDepartment(department);
    userJpaRepository.save(user);
}
Department savedDepartmetn = jpaRepository.save(department);
return savedDepartmetn;

ユーザーの追加と削除はすべて正常に機能し、データベースに反映されますが、唯一の問題は最後から2行目にあり、ユーザーに加えられた変更の前に行われる選択からhibernateがデータを入力するため、isntancesavedDepartmentには削除されたユーザーが含まれます。実際にデータベースにフラッシュされます。ここでの最善のアプローチは何ですか、

  • 部門を保存する前にフラッシュする必要があります(部門の保存が失敗した場合、トランザクションはロールバックされます)
  • 呼び出し元に返す前にsavedInstanceを更新する必要があります
  • その他のアイデア。
4

1 に答える 1

2

アタッチされたエンティティを使用しているため、何も保存する必要はありません。JPAは、アタッチされたエンティティに対して行った変更を自動的に保持します。

また、双方向の関連付けがある場合は、オブジェクトモデルの一貫性を確保するために、両側で変更を加える必要があります。user.departmentnullに設定した場合は、ユーザーもから削除する必要がありますdepartment.users

上記のコードが何をしているのかわかりませんが、保存するための呼び出しを削除し、関連付けの両側を維持してください。すべてが正常になります。

于 2012-05-28T11:45:32.977 に答える