2017-10-17 7 views
0

J'ai 2 modèles: utilisateur et film. J'ai configuré une relation de ManyToMany entre eux en utilisant:Comment enregistrer un enregistrement ManyToMany?

Movie.java (modèle):

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

Lorsqu'un film est ajouté je l'attrape dans le MovieController:

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

En le MovieService:

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

Je peux ajouter un film à la table de film sans problème, mais comment puis-je créer un enregistrement dans la table de jointure?

Répondre

0

Dans votre cas, l'utilisateur est le propriétaire de la relation, vous devez donc ajouter un film à l'objet Utilisateur et stocker l'utilisateur dans la base de données. Il y a beaucoup de questions similaires sur SO - par exemple: @ManyToMany relation not save

Edit: Vous devez enregistrer l'objet utilisateur au lieu de film. Ajouter un film à l'utilisateur et stocker l'utilisateur dans la base de données. Vous devez passer userId au contrôleur pour trouver l'utilisateur auquel vous voulez ajouter un film.

Créer DTO:

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

Ensuite, changez votre contrôleur et le service à:

@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); 
} 

Mais vous devez changer vos noms de fonction: addMovieToUser ou quelque chose comme ça.

+0

Je peux trouver beaucoup d'exemples de la façon de construire une relation, mais je ne trouve pas d'exemples de ce que le code devrait être dans le service ou le contrôleur pour enregistrer réellement l'objet. –