java - 为什么将实体添加到集合中不会将它们添加到数据库中?
问题描述
我有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
*/
如何将电影添加到我的演员?我的代码有什么问题?
解决方案
推荐阅读
- python - Pyspark 加载 UTF-8 csvs 导致 BOM 编码错误
- mysql - 如何根据另一个列值在查询中选择多个不同的列和连接?
- vb.net - 需要修复我的 parallel.foreach 的死锁问题
- javascript - 如何理解我用来调用 Powershell 代码的 JavaScript?
- excel - 导入并复制粘贴到另一个工作表
- angular - 绑定表达式不能在表达式 ANGULAR 7 的末尾包含链式表达式
- android - 手机解锁时未调用Android NFC-HCE HostApduService
- sql - How can I find duplicate rows If I can't use ROW_NUMBER() in WHERE?
- android - 在不打开/关闭应用程序的情况下使用 ADB 运行 Espresso 测试?
- c# - How to check remotely if my .net console app is running by sending a request to it and getting a custom response from it