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

我有以下实体:

球队

@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;

}

}

现在,当使用{UTR1,UTR3}更新包含例如Team.userTeamRoles =

{UTR1,UTR2}的Team实体时,我希望删除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>());该列表将被重置,并且由于级联,先前的列表将被删除。

任何帮助表示赞赏。谢谢

回答:

  1. 不必替换集合(team.setUserTeamRoles(new HashSet<UserTeamRole>());),而必须替换clear()为现有集合。发生这种情况是因为,如果Hibernate从DB加载了实体(及其集合),它将“管理”它们。跟踪他们的更改。通常,在使用Hibernate时,最好 为集合(列表,集合)创建任何设置器。仅创建吸气剂,并清除其返回的集合,即:

team.getUserTeamRoles().clear();

  1. 另一件事是您错过了孤立删除(即从父级集合中删除子对象时删除子对象)。要启用它,您需要添加@OneToMany(orphanRemoval=true)拥有实体。

以上是 Hibernate @OneToMany在更新父级时从列表中删除子级 的全部内容, 来源链接: utcz.com/qa/404995.html

回到顶部