【发布时间】: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