如何插入具有多对多关系的实体?

问题描述 投票:0回答:1

我正在使用Spring框架。我有两个实体,电影和演员,因此电影可以有许多演员,而演员可以在许多电影中播放。以下是我们的课程:

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

@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<Movie> movies;

    public Actor(String name, String surname, String age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public List<Movie> getMovies() {
        return movies;
    }

    public void setMovies(List<Movie> movies) {
        this.movies = movies;
    }   
}
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Movie {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String genre;
    private String year;

    @ManyToMany(mappedBy = "movies")
    private List<Actor> actors;

    public Movie(String title, String genre, String year, List<Actor> actors) {
        this.title = title;
        this.genre = genre;
        this.year = year;
        this.actors = actors;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public List<Actor> getActors() {
        return actors;
    }

    public void setActors(List<Actor> actors) {
        this.actors = actors;
    }
}

我已经使用@ManyToMany批注定义它们之间的关系。

[在这一点上,我在H2中有一个具有ID,AGE,NAME和SURNAME列的表Actor,具有ID,GENRE,TITLE和YEAR的表Movie,以及一个新表MOVIE_ACTOR,因为带有ACTORS_ID和MOVIES_ID列的注释。到这里为止似乎还不错。

现在,如果我保存电影(我已经实现了扩展两个实体的jpaRepository的服务和存储库:]

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

((我知道这不是获取请求,只是为了检查电影是否只是访问端点而正确保存了)。我得到的是,在电影表中正确添加了4列,但是ACTOR和MOVIE_ACTOR均未添加完成后,actorList被省略,这两个表为空。为什么会发生这种情况,我该如何解决?

非常感谢您的帮助!

java spring spring-boot spring-data-jpa
1个回答
0
投票

[也许您在服务方法中实现了这样的事情(您没有显示),但是我认为它丢失了:您什么都没有cascade(分别保存另一个类的对象)。您应该将@ManyToMany注释更改为@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})。这导致级联合并和持久操作(保存一个新对象或进行任何更改会导致自动更新另一个对象)。

也请考虑为列表添加适当的添加和删除方法,如本article和好的equals and hashCode methods中所述。

通常,您可以在Vlad Mihalcea页面上找到有关Hibernate相关问题的很好描述。

© www.soinside.com 2019 - 2024. All rights reserved.