У меня есть две основные таблицы под названием «Фильм и актер». В фильме могут быть несколько актеров и наоборот. Поэтому я сделал таблицу соединения под названием Movieactor. Проблема в том, что я не могу найти способ удалить старые ряды из таблицы соединения Moviactor, когда ссылки из двух таблиц обновляются. Я буду визуализировать это, так что это легче понять. Let's say I have a movie that has two actors.
id
movie_id
actor_id
< /thead>
1 < /td>
1 < /td>
1 < /td>
< /tr>
2 < /td>
1 1 1 1 1 1 1 1 1 1 1 1 1 1 /> 2 < /td>
< /tr>
< /tbody>
< /table> < /div>
Вот как таблица соединения будет их подключать.
Но, допустим, я хочу изменить список актеров. Я хочу актера 3 и 4 вместо актера 1 и 2. < /P>
id < /th>
movie_id < /th>
actor_id < /th>
< /thead>
1 < /td>
1 < /td>
1 < /td>
< /tr>
2 < /td>
1 1 1 1 1 1 1 1 1 1 1 1 1 1 /> 2 < /td>
< /tr>
3 < /td>
1 < /td>
3 < /td>
< /tr>
4 < /td>
< /tr>
4 < /td>
< /tr /> 4 < /td>
< /tr>
< /tbody>
< /table> < /div>
Это проблема, с которой я сталкиваюсь. Hibernate не удалит старые ряды. Первые два ряда должны быть удалены из БД, так как я обновляю фильм с разными актерами. < /P>
public class Movie {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "movie_id", columnDefinition = "bigint", unique = true, nullable = false)
private Long id;
@Column(name = "name", columnDefinition="varchar(255)", nullable=true)
private String name;
@OneToMany(mappedBy="movie", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JsonManagedReference
private List MovieActors;
}
< /code>
public class MovieActor implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "movie_actor_id", columnDefinition = "bigint", unique = true, nullable = false)
private Long id;
@ManyToOne()
@JoinColumn(name="movie_id")
@JsonBackReference
private Movie movie;
@ManyToOne()
@JoinColumn(name="actor_id")
@JsonBackReference
private Actor actor;
}
< /code>
Here is my Service method for update.
public String updateMovie(String movieData) throws JsonProcessingException {
try {
JSONObject movieObj = new JSONObject(movieData);
// Check if movie exist
Optional movieOpt = movieRepository
.findById(movieObj.getLong("id"));
if (movieOpt.isEmpty())
return "Movie does not exist";
Movie movie = movieOpt.get();
List movieActors = new ArrayList();
// Check if actors exist
JSONArray actorIdArray = movieObj.getJSONArray("actor_ids");
for (int i = 0; i < actorIdArray.length(); i++) {
Optional actorOpt = actorRepository
.findById(actorIdArray.getLong(i));
if (actorOpt.isEmpty())
return "actor doesn't exist";
// Save MovieActor
MovieActor movieActor = new MovieActor();
movieActor.setMovie(movie);
movieActor.setActor(actorOpt.get());
movieActors.add(movieActor);
}
movie.setMovieActors(movieActors);
Movie updatedMovie = movieRepository.saveAndFlush(movie);
return CustomResponse(HttpStatus.ACCEPTED.value(),updatedMovie);
} catch (Exception e) {
log.error("Exception", e);
return CustomResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
}
}
< /code>
I have tried using
movieActorRepository.deleteAll(movie.getMovieActors());
< /code>
before saving the new ones. And it still doesn't work. The old rows are still there in the database.
Подробнее здесь: https://stackoverflow.com/questions/794 ... join-table