Hibernate: как УДАЛИТЬ сущность, на которую ссылаются другие сущности без каскада? - PullRequest
0 голосов
/ 03 июня 2018

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

    @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.Как УДАЛИТЬ Экземпляр команды правильно, не удаляя указанный TeamMember?Это метод удаления внутри TeamController:

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

1 Ответ

0 голосов
/ 03 июня 2018

Как правильно УДАЛИТЬ экземпляр команды без удаления указанного TeamMember?

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

Основная идея - разорвать отношения между командойОбъект и его члены

Ваш код может выглядеть следующим образом:

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;            
}
...