2017-10-17 106 views
0

我有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); 
} 

我可以将影片添加到影片表中而没有问题,但是如何才能在连接表中创建一条记录?

回答

0

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

编辑: 您必须保存User对象而不是Movie。将影片添加到用户并将用户存储在数据库中。您必须将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或类似这样的东西。

+0

我可以找到很多关于如何建立关系的例子,但是我找不到任何代码应该在服务或控制器中实际保存对象的例子。 –