【问题标题】:POST request with Many-to-many relationship in Spring Data RESTSpring Data REST中具有多对多关系的POST请求
【发布时间】:2019-01-29 05:16:54
【问题描述】:

我正在尝试将电影添加到 MySQL 数据库,这是我的数据库架构:

Movie(id, name)
Genre(id, name)
Movie_genre(id_movie, id_genre)

这是我的模型类:

Movie.ts

public class Movie {

    private Short id;
    private String name;
    private List<MovieGenre> movieGenres;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    public Short getId() {
        return id;
    }

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

    @Column(name = "name", nullable = false, length = 100)
    public String getName() {
        return name;
    }

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

    @OneToMany(mappedBy = "movie")
    public List<MovieGenre> getMovieGenres() {
        return movieGenres;
    }

    public void setMovieGenres(List<MovieGenre> movieGenres) {
        this.movieGenres = movieGenres;
    }
}

流派.ts

public class Genre {
    private Short id;
    private String name;
    private List<MovieGenre> movieGenres;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    public Short getId() {
        return id;
    }

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

    @Column(name = "name", nullable = false, length = 15)
    public String getName() {
        return name;
    }

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

    @OneToMany(mappedBy = "genre")
    @JsonIgnore
    public List<MovieGenre> getMovieGenres() {
        return movieGenres;
    }

    public void setMovieGenres(List<MovieGenre> movieGenres) {
        this.movieGenres = movieGenres;
    }
}

MovieGenre.ts(该模型代表生成的表格)

public class MovieGenre {
    private MovieGenrePK id;
    private Movie movie;
    private Genre genre;

    @EmbeddedId
    @JsonIgnore
    public MovieGenrePK getId() {
        return id;
    }

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

    @MapsId("movieId")
    @ManyToOne
    @JoinColumn(name = "movie_id", referencedColumnName = "id", nullable = false)
    @JsonIgnore
    public Movie getMovie() {
        return movie;
    }

    public void setMovie(Movie movie) {
        this.movie = movie;
    }

    @MapsId("genreId")
    @ManyToOne
    @JoinColumn(name = "genre_id", referencedColumnName = "id", nullable = false)
    public Genre getGenre() {
        return genre;
    }

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

因为我们在最后一个模型中有复合键,所以我们需要一个类:

public class MovieGenrePK implements Serializable {
    private Short movieId;
    private Short genreId;

    @Column(name = "movie_id", nullable = false)
    public Short getMovieId() {
        return movieId;
    }

    public void setMovieId(Short movieId) {
        this.movieId = movieId;
    }

    @Column(name = "genre_id", nullable = false)
    public Short getGenreId() {
        return genreId;
    }

    public void setGenreId(Short genreId) {
        this.genreId = genreId;
    }
}

所以我试图通过发布请求来添加具有流派的电影,首先我提出了一个添加电影的发布请求,另一个添加流派的请求,这很好,现在我需要将流派关联到一部电影。
我尝试了以下方法:
我向以下端点发出了 POST 请求:http://localhost:8080/api/movieGenres,带有 application/json 标头和以下正文:

{
    "movie": "http://localhost:8080/api/movies/6",
    "genre": "http://localhost:8080/api/genres/1"
}

但我得到了错误:

{
    "timestamp": "2018-08-22T21:10:30.830+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "NullPointerException occurred while calling setter of com.movies.mmdbapi.model.MovieGenrePK.genreId; nested exception is org.hibernate.PropertyAccessException: NullPointerException occurred while calling setter of com.movies.mmdbapi.model.MovieGenrePK.genreId",
    "path": "/api/movieGenres"
}

【问题讨论】:

  • 您不需要使用 JPA 为 ManyToMany 上的连接表创建一个类。这是一个例子hellokoding.com/…
  • @JasonWhite 实际上我在连接表中有一些额外的字段,所以我需要为连接表添加一个模型
  • 如果您在Movie#getMovieGenres() 和Genre#getMovieGenres() 中删除@JsonIgnore 会发生什么?
  • 在双向关系中,必须有@JsonIgnore在两侧之一。

标签: spring spring-boot spring-data-jpa spring-data-rest


【解决方案1】:

你必须设置MovieGenrePK,改变:

public class MovieGenre {
    private MovieGenrePK id;
}

到

public class MovieGenre {
    private MovieGenrePK id = new MovieGenrePK();
}

【讨论】:

  • 谢谢。现在我收到一个新错误:attempted to assign id from null one-to-one property [com.movies.mmdbapi.model.MovieGenre.movie]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2019-03-02
相关资源
最近更新 更多