首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate @OneToMany在更新父项时从列表中删除子项

Hibernate @OneToMany在更新父项时从列表中删除子项
EN

Stack Overflow用户
提问于 2013-02-04 20:15:16
回答 1查看 68.6K关注 0票数 37

我有以下实体:

团队

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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;
 }
}

现在,当使用{UTR1,UTR3}更新包含例如Team.userTeamRoles = {UTR1,UTR2}的团队实体时,我希望删除UTR2。但我现在这样做,旧的列表保持不变,它只将UTR3添加到列表中。

这就是我目前的做法:

代码语言:javascript
复制
 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>());,列表将被重置,并且由于级联,先前的列表将被删除。

任何帮助都是非常感谢的。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-04 20:25:41

  1. 而不是替换集合(team.setUserTeamRoles(new HashSet<UserTeamRole>());),您必须对现有集合执行clear()操作。这是因为如果Hibernate从DB加载实体(和它的集合),它就会“管理”它们。跟踪它们的更改。通常,当使用Hibernate时,最好使用而不是来为集合(列表、集合)创建任何setter。只创建getter,并清除它返回的集合,即:

team.getUserTeamRoles().clear();

  • Another的问题是你错过了孤立删除(即.删除子对象(当子对象从父对象的集合中删除时)。要启用它,您需要在拥有实体中添加@OneToMany(orphanRemoval=true)
票数 108
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14686595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档