Hibernate で悪名高い「deleted object would be re-saved by cascade error」というエラーが表示され、解決するために助けが必要です。
エンティティ モデルは次のとおりです。それらの間には、Person、Team、および TeamMemberships があります。個人は多くのチームに属することができ、チームは TeamMembership オブジェクトを介してそれにリンクする多くの個人を持つことができます。
チーム
@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);