Как добавить/удалить объект сущности ManyToMany?
У сущности User и Moive есть связь ManyToMany в которой пользователь может добавить фильм в избранные. При добавление фильма в избранные пользователю - сущность сохраняется, но при удалении - ничего не меняется и эта сущность остается. Также и при удалении фильма из избранных пользователя, если фильм уже есть у пользователя в избранных его можно только удалить, но добавить уже не сможешь. Пробовал добавлять так -
User entity {
public void addFavorite(Movie movie) {
this.favorites.add(movie);
movie.getSpectators().add(this);
}
public void deleteFavorite(Movie movie){
this.favorites.remove(movie);
movie.getSpectators().removie(this);
}
}
Но не помогло.
User entity -
@Entity
@Table(name = "user")
@PasswordMatch(message = "Пароль должен совпадать")
public class User implements UserDetails, Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_user")
private Long idUser;
@Column(name = "username")
private String username;
@Column(name = "email")
private String email;
@Column(name = "activation_code")
private String activationCode;
@ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
@CollectionTable(name = "role", joinColumns = @JoinColumn(name = "id_user"))
@Column(name = "name")
@Enumerated(EnumType.STRING)
private Set<Role> roles;
@ManyToMany(fetch = FetchType.EAGER, targetEntity = Movie.class, cascade = CascadeType.ALL)
@JoinTable(
name = "user_has_favorite_movie",
joinColumns = {
@JoinColumn(name = "user_id")},
inverseJoinColumns = {
@JoinColumn(name = "movie_id")})
private Set<Movie> favorites = new HashSet<>();
public User() {
}
Movie entity -
@Entity
@Table(name = "movie")
@NamedQueries({
@NamedQuery(name = "Movie.findAll", query = "SELECT m FROM Movie m ORDER BY idMovie DESC")})
public class Movie implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_movie")
private Long idMovie;
@NotNull
@Size(max = 80)
@Column(name = "name")
private String name;
@ManyToMany(mappedBy = "favorites", targetEntity = User.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<User> spectators = new HashSet<>();
public Movie() {
}
controller который обрабатывает эти запросы -
@GetMapping("{id}/favorite")
public String addFavorite(@AuthenticationPrincipal User user, @PathVariable int id) {
Movie movie = movieService.getMovieById(id);
userService.addFavorite(user, movie);
return "redirect:/watch/" + name + "#movie";
}
@GetMapping("{id}/unfavorite")
public String removeFavorite(@AuthenticationPrincipal User user, @PathVariable int id) {
Movie movie = movieService.getMovieById(id);
userService.removeFavorite(user, movie);
return "redirect:/watch/" + name + "#movie";
}
методы из userService который сохраняет изменения -
public void addFavorite(User user, Movie movie) {
user.getFavorites().add(movie);
userRepository.save(user);
}
public void removeFavorite(User user, Movie movie) {
user.getFavorites().remove(movie);
userRepository.save(user);
}
