How to insert entity with many to many relation?

后端 未结 2 1993
我寻月下人不归
我寻月下人不归 2021-01-26 07:01

I\'m working with Spring framework. I have two entities, Movie and Actor, so a Movie can have many actors and an Actor can play in many Movie. Following we have the classes:

2条回答
  •  清歌不尽
    2021-01-26 07:10

    Maybe you implemented something like this in your service methods (you did not show it) but I would assume that it is missing: You do not cascade anything (respectively save objects of the other class). You should change your @ManyToMany annotation to @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}). This leads to cascading the merge and persist operation (saving a new object or any changes leads to automatically updating the other one).

    Also consider adding proper add and remove methods for your lists like described in this article and good equals and hashCode methods.

    In general, you could find very good descriptions of Hibernate related issues on the page of Vlad Mihalcea.

    Update: Implementation Based on Post of @Alan Hay

    Model

    @Entity
    public class Actor {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private String surname;
        private String age;
    
        @ManyToMany
        @JoinTable(name = "movie_actor")
        private List movies = new ArrayList<>();
    
        public void addMovie(Movie movie) {
            movies.add(movie);
            movie.getActors().add(this);
        }
    
        public void removeMovie(Movie movie) {
            movies.remove(movie);
            movie.getActors().remove(this);
        }
    
        // Constructors, getters and setters...
    
        // Equals and hashCode methods a la 
        // https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/
    }
    
    @Entity
    public class Movie {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String title;
        private String genre;
        private String year;
    
        @ManyToMany(mappedBy = "movies", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
        private List actors;
    
        public Movie(String title, String genre, String year, List actors) {
            this.title = title;
            this.genre = genre;
            this.year = year;
            actors.forEach(a -> a.addMovie(this));
        }
    
        // Getters and setters...
    }
    

    Create Method

    @GetMapping("/create")
    public void create() {
        Actor actor1 = new Actor("Pedro", "Perez", "40");
        Actor actor2 = new Actor("Alfredo", "Mora", "25");
        Actor actor3 = new Actor("Juan", "Martinez", "20");
        Actor actor4 = new Actor("Mario", "Arenas", "30");
    
        List actorList = new ArrayList<>();
        actorList.add(actor1);
        actorList.add(actor2);
        actorList.add(actor3);
        actorList.add(actor4);
    
        Movie movie = new Movie("Titanic", "Drama", "1984", actorList);
    
        movieService.create(movie);
    }
    

提交回复
热议问题