1

我在 Hibernate 中遇到了臭名昭著的“已删除的对象将被级联错误重新保存”,我需要一些帮助来解决它。

实体模型如下:它们之间有一个Person、Team和TeamMemberships。一个 Person 可以属于多个 Teams,一个 Team 可以通过 TeamMembership 对象有多个 Person 链接到它。

团队

@OneToMany(mappedBy="team", cascade=CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval=true)
private List <TeamMembership> teamMemberships;

@OneToMany(mappedBy="person", cascade=CascadeType.ALL, orphanRemoval=true)
private List <TeamMembership> teamMemberships;

团队成员

@ManyToOne
@JoinColumn(name="teamId", nullable=false)
private Team team;

@ManyToOne
@JoinColumn(name="personId", nullable=false)
private Person person;

所以基本上 TeamMembership 是 Person 和 Team 的“孩子”。当我从团队方面编辑团队成员资格时,一切正常。但是,当我尝试从人员方面编辑团队成员资格时,我会收到此错误。我的一些映射注释是不正确的还是我错过了?任何其他解决方案将不胜感激。

编辑:我通过 TeamController 在团队方面处理 TeamMemberships,如下所示:

首先,我从 jsp 中获取人员 ID。我调用以下方法:

private List<TeamMembership> processMembershipList (Team team, Long[] personIds, String teamRole) {
    List<TeamMembership> memberships = team.getTeamMemberships();
    boolean isNewTeam = false;

    if (team.getId() == null) {
        isNewTeam = true;
    }

    for (Long personId: personIds) {
        TeamMembership teamMembership = null;
        Person person = personService.getPerson(personId);
        if (!isNewTeam) {
            teamMembership = teamMembershipService.getTeamMembership(team, person, teamRole);
        }
        if (teamMembership == null) {
            teamMembership = new TeamMembership();
            teamMembership.setPerson(person);
            teamMembership.setTeam(team);
            teamMembership.setTeamRole(teamRole);
        }

        memberships.add(teamMembership);
    }
    return memberships;
}

最后:

teamService.saveTeam(team);

在 Person 方面,我通过 Person Controller 做同样的事情:

获取团队 ID 并调用以下方法来处理团队成员资格:

private List<TeamMembership> processTeamMembershipList (Person person, Long[] teamIds, String teamRole) {
    List<TeamMembership> memberships = person.getTeamMemberships();
    boolean isNewPerson = false;

    if (person.getId() == null) {
        isNewPerson = true;
    }

    for (Long teamId: teamIds) {
        TeamMembership teamMembership = null;
        Team team = teamService.getTeam(teamId);
        if (!isNewPerson) {
            teamMembership = teamMembershipService.getTeamMembership(team, person, teamRole);
        }
        if (teamMembership == null) {
            teamMembership = new TeamMembership();
            teamMembership.setPerson(person);
            teamMembership.setTeam(team);
            teamMembership.setTeamRole(teamRole);
        }

        memberships.add(teamMembership);
    }
    return memberships;
}

最后:

personService.savePerson(person);
4

0 回答 0