37

次のエンティティがあります。

チーム

@Entity
@Table
public class Team {
[..]
private Set<UserTeamRole> userTeamRoles;

/**
 * @return the userTeamRoles
 */
@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "team", fetch = FetchType.LAZY)
public Set<UserTeamRole> getUserTeamRoles() {
    return userTeamRoles;
}

/**
 * @param userTeamRoles
 *            the userTeamRoles to set
 */
public void setUserTeamRoles(Set<UserTeamRole> userTeamRoles) {
    this.userTeamRoles = userTeamRoles;
}

}

USER_TEAM_ROLE

@Entity
@Table(name = "user_team_role")
public class UserTeamRole {

 @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
 @JoinColumn(name = "FK_TeamId")
 public Team getTeam() {
    return team;
 }
}

ここで、たとえば Team.userTeamRoles = {UTR1, UTR2} を含む Team エンティティを {UTR1, UTR3} で更新するときに、UTR2 を削除したいと考えています。しかし、私が今行っている方法では、古いリストは同じままで、UTR3 をリストに追加するだけです。

これは私が現時点で行う方法です:

 if (!usersDualListData.getTarget().isEmpty()) {
        // the role for each user within the team will be "employee"
        team.setUserTeamRoles(new HashSet<UserTeamRole>());
        Role roleForUser = roleService
                .getRoleByName(RoleNames.ROLE_EMPLOYEE.name());
        for (User user : usersDualListData.getTarget()) {
            UserTeamRole utr = new UserTeamRole();
            utr.setUser(user);
            utr.setTeam(team);
            utr.setRole(roleForUser);
            team.getUserTeamRoles().add(utr);
        }
    }

teamService.updateTeam(team);

team.setUserTeamRoles(new HashSet<UserTeamRole>());リストを実行するとリセットされ、カスケードのために以前のリストが削除されると思いました。

どんな助けでも大歓迎です。ありがとうございました

4

1 に答える 1

108
  1. team.setUserTeamRoles(new HashSet<UserTeamRole>());コレクション ( ) を置き換える代わりにclear()、既存のものを使用する必要があります。これは、Hibernate がエンティティ (およびそのコレクション) を DB からロードする場合、それらを「管理」するためです。それらの変更を追跡します。通常、Hibernate を使用する場合は、コレクション (リスト、セット) のセッターを作成しない方がよいでしょう。ゲッターのみを作成し、それによって返されたコレクションをクリアします。つまり、次のようになります。

    team.getUserTeamRoles().clear();

  2. もう1つのことは、孤立した削除を見逃していることです(つまり、親のコレクションから削除されたときに子オブジェクトを削除します)。@OneToMany(orphanRemoval=true)有効にするには、所有エンティティを追加する必要があります。

于 2013-02-04T12:25:41.157 に答える