Hibernate: как DELETE Entity, на которые ссылаются другие объекты без каскада?

Adl спросил: 10 мая 2018 в 04:21 в: java

У меня есть два класса:

    @Entity
    @Table(name = "team")
    @Getter
    @Setter
    @NoArgsConstructor
    public class Team {     @Id
     @GeneratedValue
     private Long id;     private String name;     @Enumerated(EnumType.STRING)
     private ProblemArea problemArea;     @JsonIgnore
     @OneToMany(mappedBy = "team")
     @Cascade(value = org.hibernate.annotations.CascadeType.PERSIST)
     private List<TeamMember> teamMemberList;     @JsonIgnore
     @OneToOne
     @Cascade(value = org.hibernate.annotations.CascadeType.PERSIST)
     private TeamLeader teamLeader;
   }    @Entity
    @Table(name = "team_member")
    @Getter
    @Setter
    public class TeamMember extends InternalUser {     @OneToOne
     @Cascade(value = org.hibernate.annotations.CascadeType.PERSIST)
     protected Team team;
    }

Проблема в том, что когда Я пытаюсь УДАЛИТЬ экземпляр Team, у меня возникла ошибка, связанная с внешним ключом, указанным в таблице TeamMember. Как удалить экземпляр команды DELETE Team без удаления ссылки TeamMember? Это метод удаления внутри TeamController:

        public boolean deleteTeam(@NotNull Long id) {
         if (!teamDao.existsById(id)) {
         return false;
         }
         teamDao.deleteById(id);
         return true;
        }

1 ответ

YCF_L ответил: 10 мая 2018 в 04:35

Как удалять экземпляр команды правильно, не удаляя referedTeamMember?

  1. Прежде всего, вам нужно найти объект Team
  2. Для каждого TeamMember этой команды установите null в команду
  3. очистите список участников из команды
  4. , затем удалите команду

. Основная идея заключается в том, чтобы разорвать связь между объектом Team и его Memebers

Ваш код может выглядеть так:

public boolean deleteTeam(@NotNull Long id) {
    //Find the Team by its id
    Team team = teamDao.findById(id);   
    //If the team exist then    
    if (team != null) {                     
        for (TeamMember member : team.getTeamMemberList) {
            //Set null to Team for each Member(Brock the relation between father and sons)
            member.setTeam(null);           
        }
        //Make sure that the list of members are empry
        team.getTeamMemberList.clear();
        //then delete the team
        teamDao.deleteById(team.getId());
        return true;
    }
    //Else if the team is null return false
    return false;            
}

Дополнительное видео по вопросу: Hibernate: как DELETE Entity, на которые ссылаются другие объекты без каскада?

02 - Java+JDBC+Hibernate+Spring Data JPA. JDBC. Создание entity слоя

Spring Boot JPA (Hibernate): добавляем базу данных в веб приложение на Java (простой сайт)

Hibernate Tip: How to delete child entities from a many-to-one association