Как обновить список пользователей в классе User Spring Boot

У меня есть класс пользователя Java, у пользователя могут быть друзья (List<User>). По умолчанию Hibernate создает две таблицы: USER и USER_FRIENDS(USER_ID,FRIENDS_ID).

Проблема в том, что когда я меняю друзей в своем коде и сохраняю (пользователя), spring добавляю новых друзей, но не удаляю в базе данных друзей, удаленных из списка массивов.

@Entitypublic class User implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String pseudo;
private String password;
private String email;
private Gender gender;
@Lob
private byte[] avatar;
private String description;
private Date birthdate;

@ManyToMany(cascade = CascadeType.ALL)
private List<Game> favoriteGames = new ArrayList<>();

@OneToMany( cascade = CascadeType.ALL)
private List<User> friends = new ArrayList<>();

Я пробовал @ManyToMany, @OneToMany, cascade = CascadeType.ALL


49
1

Ответ:

Решено

По сути, сначала я бы посоветовал вам проявлять особую осторожность с реализацией equals и hashCode в ваших объектах. Вы нам этого не показали, но в вашем User.java должно быть что-то вроде этого:

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (!(o instanceof User)) {
        return false;
    }
    User other = (User) o;
    return id != null && id.equals(other.getId());
}

@Override
public int hashCode() {
    return getClass().hashCode();
}

Это очень важно, особенно при работе с сущностями в коллекциях.

Во-вторых, связь между Пользователем и его Друзьями (другими Пользователями) должна моделироваться как Многие-ко-Многим, потому что:

  • каждый пользователь может быть другом для МНОГИХ других пользователей
  • у каждого пользователя может быть любое количество друзей, другими словами МНОГИЕ друзья

И я бы смоделировал это соединение так:

@ManyToMany
@JoinTable(name = "user_friends", joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "friend_user_id"))
private Set<User> friends = new HashSet<>();