首页 > 解决方案 > 为什么将实体添加到集合中不会将它们添加到数据库中?

问题描述

我有Movies实体Actors,当我将持久化的演员添加到电影并将此电影保存到数据库时,我可以看到这些演员已连接到电影。

    @Test
    public void createMovieWithActorsSuccessfully() {

        Actor actor = new Actor();
        actor.setFirstName("jan");
        actor.setLastName("kowalski");
        actorRepository.save(actor);

        Category category = new Category();
        category.setName("Comedy");
        categoryRepository.save(category);

        Director director = new Director();
        director.setFirstName("wladyslaw");
        director.setLastName("kwiatkowski");
        directorRepository.save(director);

        User someOwner = new User();
        someOwner.setUsername("someOwner");
        someOwner.setPassword("dummyPassword");
        someOwner.setFirstName("jan");
        someOwner.setLastName("kowalski");
        userRepository.save(someOwner);

        Movie movie = new Movie();
        movie.setYearProduced(Year.of(2000));
        movie.setCategory(category);
        movie.setDirector(director);
        movie.setName("dummy movie");
        movie.setOwner(someOwner);
        movie.setCost(BigDecimal.valueOf(300f));
        movie.setDescription("movie for testing");

        movie.getActors().add(actor);
        movieRepository.save(movie);

        Optional<Movie> optionalFoundMovie = movieRepository.findById(movie.getId());
        assertTrue(optionalFoundMovie.isPresent());
        Movie foundMovie = optionalFoundMovie.get();
        assertEquals(1, foundMovie.getActors().size());

        List<Actor> actors = Utils.iterableToCollection(foundMovie.getActors(), ArrayList::new);

        assertTrue(actors.contains(actor));

        List<Movie> movies = Utils.iterableToCollection(actors.get(0).getMovies(), ArrayList::new);
        assertEquals(1, movies.size());
        assertTrue(movies.contains(foundMovie));
    }

在上面的测试中,当我找到电影时,它有演员在收藏中,而这个演员在自己的收藏中有这部电影。

Movie实体:

@Entity
public class Movie extends Product {

    ...

    @ManyToMany(fetch = FetchType.EAGER /*,cascade = {CascadeType.MERGE, CascadeType.REFRESH}*/)
    @JoinTable(name = "MOVIE_ACTOR",
            joinColumns = @JoinColumn(name = "movie_id"),
            inverseJoinColumns = @JoinColumn(name = "actor_id")
    )
    private Set<Actor> actors = new HashSet<>();
}

Actor实体:

public class Actor extends Person {

    @ManyToMany(mappedBy = "actors", fetch = FetchType.EAGER /*, cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST}*/)
    private Set<Movie> movies = new HashSet<>();

/*
    public void add(Movie m) {
        m.getActors().add(this);
        movies.add(m);
    }
*/
}

当我将电影添加到演员并将他保存到数据库时,我通过 id 找到他,找到的演员电影集合是空的。

    @Test
    public void actorAddedToMoviesSuccessfully() {

        Movie movie = new Movie();
        movie.setYearProduced(Year.of(2000));
        movie.setCategory(category);
        movie.setDirector(director);
        movie.setName("dummy movie");
        movie.setOwner(someOwner);
        movie.setCost(BigDecimal.valueOf(300f));
        movie.setDescription("movie for testing");
        movieRepository.save(movie);

        Movie movie2 = new Movie();
        movie2.setYearProduced(Year.of(2003));
        movie2.setCategory(category);
        movie2.setDirector(director);
        movie2.setName("dummy movie2");
        movie2.setOwner(someOwner);
        movie2.setCost(BigDecimal.valueOf(300f));
        movie2.setDescription("movie for testing");
        movieRepository.save(movie2);

        Actor actor = new Actor();
        actor.setFirstName("jan");
        actor.setLastName("kowalski");

        actor.add(movie);
        actor.add(movie2);

        actorRepository.save(actor);

        Actor foundActor = actorRepository.findById(actor.getId()).get();

        assertEquals(2, foundActor.getMovies().size()); // asserion error

        foundActor.getMovies().forEach(m -> assertTrue(m.getActors().contains(foundActor)));
/*
java.lang.AssertionError: 
Expected :2
Actual   :0
*/

如何将电影添加到我的演员?我的代码有什么问题?

标签: javaspringspring-bootjpamany-to-many

解决方案


推荐阅读