У меня есть класс пользователя 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
По сути, сначала я бы посоветовал вам проявлять особую осторожность с реализацией 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<>();