jpa 无法在两个实体之间创建多对多关系

thtygnil  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(124)

在两个实体之间创建多对多关系时遇到问题:演员和电影。电影可以有多个演员,演员也可以有多部电影。当我点击一部电影时,我可以看到它的所有演员,当我点击演员时,我可以看到演员演过的所有电影,这与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
    }
]

我如何解决这个问题,使电影具有演员列表对象,演员具有电影列表对象

oxiaedzo

oxiaedzo1#

@JsonIgnore是这里的罪魁祸首,它在忽略电影列表。
我知道,如果你从那里删除jsonIgnore,你会遇到json的无限循环。
我建议不要返回实体对象,而只返回包含所需数据的DTO对象。您可以使用结果转换器直接从Hibernate查询/条件结果中获取一个。

ivqmmu1c

ivqmmu1c2#

您使用@JsonIgnore是为了不将字段持久化在数据库中,还是I;如果是这样的话,也许用@Transient代替它是个好主意,它实际上完成了上面的工作。

相关问题