在两个实体之间创建多对多关系时遇到问题:演员和电影。电影可以有多个演员,演员也可以有多部电影。当我点击一部电影时,我可以看到它的所有演员,当我点击演员时,我可以看到演员演过的所有电影,这与IMDB的工作原理类似。
这是我的电影课
@Entity
@ToString
@Getter // Both getters and setters are essential in allowing JSON to be converted into a Java Obj
@Setter
@Table(name="MOVIES")
@AllArgsConstructor
@NoArgsConstructor
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name="MOVIE_NAME")
private String movieName;
@Column(name="YEAR_OF_RELEASE")
private short yearOfRelease;
@Column(name="DESCRIPTION")
private String description;
@Column(name="RENTAL_COST")
private double rentalCost;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="movies_actors",
joinColumns = @JoinColumn(name="movie_id"),
inverseJoinColumns =@JoinColumn(name="actor_id"))
private Set<Actor> actors;
@OneToMany(cascade = CascadeType.ALL)
private List<UserReview> userReviews;
// Constructor
public Movie(
@JsonProperty("movieName") String movieName,
@JsonProperty("yearOfRelease") short yearOfRelease,
@JsonProperty("description") String description,
@JsonProperty("rentalCost") float rentalCost,
@JsonProperty("actors") Set<Actor> actors,
@JsonProperty("userReviews") List<UserReview> userReviews
)
{
this.movieName = movieName;
this.yearOfRelease = yearOfRelease;
this.description = description;
this.rentalCost = rentalCost;
this.actors = actors;
this.userReviews = userReviews;
}
}
这是我的演员课
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Table(name="ACTORS")
public class Actor {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer Id;
@Column(name="FIRST_NAME")
private String firstName;
@Column(name="LAST_NAME")
private String lastName;
@Column(name="GENDER")
private String gender;
@Column(name="AGE")
private byte age;
@JsonIgnore
@ManyToMany(mappedBy = "actors")
private List<Movie> movies;
}
使用Postman,我的movie对象能够获得演员
[
{
"movieName": "Happy Feet",
"yearOfRelease": 2022,
"description": "A penguin that is happy",
"rentalCost": 12.0,
"actors": [
{
"firstName": "Tony ",
"lastName": "Stark",
"gender": "Male",
"age": 100,
"id": 3
},
{
"firstName": "Bruce ",
"lastName": "Wayne",
"gender": "Male",
"age": 33,
"id": 2
}
],
"userReviews": [
{
"firstName": "Alex",
"lastName": "Groot",
"description": "This is a nice movie",
"rating": 8,
"movie": null,
"id": 4
}
],
"id": 1
}
]
但是当我得到所有演员时,我无法得到该演员演过的任何电影,而且演员对象中的“movies”属性也丢失了。
[
{
"firstName": "Bruce ",
"lastName": "Wayne",
"gender": "Male",
"age": 33,
"id": 2
},
{
"firstName": "Tony ",
"lastName": "Stark",
"gender": "Male",
"age": 100,
"id": 3
}
]
我如何解决这个问题,使电影具有演员列表对象,演员具有电影列表对象
2条答案
按热度按时间oxiaedzo1#
@JsonIgnore是这里的罪魁祸首,它在忽略电影列表。
我知道,如果你从那里删除jsonIgnore,你会遇到json的无限循环。
我建议不要返回实体对象,而只返回包含所需数据的DTO对象。您可以使用结果转换器直接从Hibernate查询/条件结果中获取一个。
ivqmmu1c2#
您使用
@JsonIgnore
是为了不将字段持久化在数据库中,还是I;如果是这样的话,也许用@Transient
代替它是个好主意,它实际上完成了上面的工作。