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

标签 database hibernate jpa associations one-to-many

我有以下实体:

团队

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

感谢任何帮助。谢谢

最佳答案

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

    team.getUserTeamRoles().clear();

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

关于database - Hibernate @OneToMany 在更新父项时从列表中删除子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14686595/

相关文章:

java - 为什么使用 JPA/Eclipselink/Texo 进行批量插入比使用纯 JDBC 插入慢得多(!)?

database - React Native [iOS] 数据库选项

javascript - 将随机数填充到新列/我们只在迁移 :generate sequelize 后添加列

java - 即使启动了持久性单元实体,JPA Spring 注入(inject) EntityManager 也为 null

java - @joinColumn name 属性对于 ManyToOne 关系是必需的吗?

java - JPA @SqlResultSetMapping 无法处理要映射到空 POJO 的空 sql 结果 - 而是抛出异常

java - 查找多个子类的不同属性

php - Laravel 过滤一对多关系

database - 全文搜索与标准数据库搜索

java - Hibernate 无法读取 hibernate.cfg.xml