如何保存ManyToMany记录?

时间:2017-10-17 18:00:21

标签: spring spring-data spring-data-jpa

我有2个模特:用户和电影。我使用:

在它们之间配置了ManyToMany关系

Movie.java(模特):

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
    name = "movie_user", 
    joinColumns = @JoinColumn(
        name = "movie_id", 
        referencedColumnName = "id"
    ), 
    inverseJoinColumns = @JoinColumn(
        name = "user_id", 
        referencedColumnName = "id"
    )
)

添加电影时,我会在MovieController中捕获它:

@RequestMapping(value = "/", method = RequestMethod.POST)
public Movie createMovie(@RequestBody Movie movie){
    return movieService.createMovie(movie);
}

在MovieService中:

@Override 
public Movie createMovie(Movie movie) {
    return movieRepository.save(movie);
}

我可以毫无问题地将电影添加到电影表中,但如何在连接表中创建记录?

1 个答案:

答案 0 :(得分:0)

在您的情况下,用户是关系的所有者,因此您必须将电影添加到用户对象并将用户存储在数据库中。 SO上有很多类似的问题 - 例如:@ManyToMany relation not save

编辑: 您必须保存用户对象而不是电影。将电影添加到用户并将用户存储在数据库中。您必须将userId传递给控制器​​才能找到要添加电影的用户。

创建DTO:

public class UserMovieDTO {
  private Movie movie;
  private Integer userId;
}

然后将您的控制器和服务更改为:

@RequestMapping(value = "/", method = RequestMethod.POST)
public Movie createMovie(@RequestBody UserMovieDTO dto){
    return movieService.createMovie(dto);
}

@Override 
public Movie createMovie(UserMovieDTO dto) {
    User user = userRepository.findBydId(dto.getUserId());
    user.getMovies().add(dto.getMovie());
    userRepository.save(user);
}

但是你应该将你的函数名改为:addMovieToUser或类似的东西。