我正在尝试将电影添加到 MySQL 数据库,这是我的数据库架构:
Movie(id, name)
Genre(id, name)
Movie_genre(id_movie, id_genre)
这是我的模型类:
电影.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;
}
}
Genre.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 header 和以下正文:{
"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"
}
最佳答案
您必须实例化 MovieGenrePK,更改:
public class MovieGenre {
private MovieGenrePK id;
}
至 public class MovieGenre {
private MovieGenrePK id = new MovieGenrePK();
}
关于spring - Spring Data REST 中具有多对多关系的 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51975413/