程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Hibernate @OneToMany在更新父级时从列表中删除子级大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Hibernate @OneToMany在更新父级时从列表中删除子级?

开发过程中遇到Hibernate @OneToMany在更新父级时从列表中删除子级的问题如何解决?下面主要结合日常开发的经验,给出你关于Hibernate @OneToMany在更新父级时从列表中删除子级的解决方法建议,希望对你解决Hibernate @OneToMany在更新父级时从列表中删除子级有所启发或帮助;
  1. 不必替换集合(team.setUserTeamRoles(new HashSet<UserTeamRole>());),而必须替换clear()为现有集合。发生这种情况是因为,如果Hibernate从DB加载了实体(及其集合),它将“管理”它们。跟踪他们的更改。通常,在使用Hibernate时,最好 为集合(列表,集合)创建任何设置器。仅创建吸气剂,并清除其返回的集合,即:

team.getUserTeamRoles().clear();

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

解决方法

我有以下实体:

球队

@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>());该列表将被重置,并且由于级联,先前的列表将被删除。

任何帮助表示赞赏。谢谢

大佬总结

以上是大佬教程为你收集整理的Hibernate @OneToMany在更新父级时从列表中删除子级全部内容,希望文章能够帮你解决Hibernate @OneToMany在更新父级时从列表中删除子级所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。