繁体   English   中英

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

[英]Unable to create a ManyToMany relationship between two entities

我无法在两个实体之间创建多对多关系:演员和电影。 这个想法是电影可以有多个演员,演员可以有多个电影。 当我点击一部电影时,我可以看到它的所有演员,当我点击演员时,我可以看到该演员演过的所有电影,类似于 IMDB 的工作方式。

这是我的电影 class

@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;
    }

}

这是我的演员 class

@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,我的电影 object 可以获取演员

[
    {
        "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
    }
]

但是当我得到所有演员时。 我无法获得该演员出演的任何电影,并且演员 obj 中的“电影”属性也丢失了。

[
    {
        "firstName": "Bruce ",
        "lastName": "Wayne",
        "gender": "Male",
        "age": 33,
        "id": 2
    },
    {
        "firstName": "Tony ",
        "lastName": "Stark",
        "gender": "Male",
        "age": 100,
        "id": 3
    }
]

如何解决此问题,以使电影具有演员列表 object 并且演员具有电影列表 object

@JsonIgnore 是这里的罪魁祸首,它忽略了电影列表。

我知道如果你从那里删除 jsonIgnore,你会遇到 json 的无限循环。 最好使用 json 忽略那里。

我建议不要返回实体 object,而是只返回带有您需要的数据的 DTO object。 您可以使用结果转换器直接从 Hibernate 查询/标准结果中获得一个。

您是在使用@JsonIgnore来不将字段保留在数据库中,还是我理解错误? 如果是这种情况,也许用@Transient替换它是个好主意,它实际上完成了上述工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM