【问题标题】:JPA ManyToMany Relationship HibernateJPA 多对多关系休眠
【发布时间】:2018-06-06 20:38:26
【问题描述】:

我有一个实体电影,然后是个人实体。 Movie 与 Person 具有多对多关系:一个是演员,另一个是制作,另一个是导演。

所以我的问题是一个人,我如何才能获得他表演、制作和导演的电影。

//人物类:

@Entity
public class Person implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@JsonView(Views.Private.class)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idPerson;
private String name;
private String surnames;
private boolean isActor;
private boolean isDirector;
private boolean isProducer;

@ManyToMany(mappedBy = "casting")
private Set<Movie> moviesCasting = new HashSet<>();

@ManyToMany(mappedBy = "movieDirection")
private Set<Movie> movieDirection = new HashSet<>();

@ManyToMany(mappedBy = "movieProduction")
private Set<Movie> movieProduction = new HashSet<>();

//电影类

 @Entity
 public class Movie implements Serializable {

private static final long serialVersionUID = 1L;    
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "casting_movie",
        joinColumns = @JoinColumn(name = "id"),
        inverseJoinColumns = @JoinColumn(name = "idPerson")
)
private Set<Person> casting = new HashSet<>();

public Set<Person> getCasting() {
    casting.size();
    return casting;
}

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "production_movie",
        joinColumns = @JoinColumn(name = "id"),
        inverseJoinColumns = @JoinColumn(name = "idPerson")
)
private Set<Person> movieProduction = new HashSet<>();

public Set<Person> getMovieProduction() {
    movieProduction.size();
    return movieProduction;
}

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "direction_movie",
        joinColumns = @JoinColumn(name = "id"),
        inverseJoinColumns = @JoinColumn(name = "idPerson")
)

private Set<Person> movieDirection = new HashSet<>();
getters and setters(...)

当我想获取有关某个人的信息时,我收到错误:未能延迟初始化角色 Movies.casting 的集合”

如果我给一个人,我想获得每个“电影”,我必须创建双向的多对多关系?

【问题讨论】:

    标签: java hibernate jpa lazy-loading


    【解决方案1】:

    您可以拥有另一个实体,该实体将具有对 Movie 和 Person 的多对一引用,并带有一个附加字段 RelationshipType(具有值 Casting、Production、Direction 等)。您应该为此创建一个枚举。

    通过这样做,您可以获取一个人的导演电影,例如(来自新实体): findByMovieAndPersonAndRelationshipType(Movie movie, Person person, RelationshipType.DIRECTED);

    附:摆脱你所有的多对多关系

    【讨论】:

    • 感谢您的回答。我会研究它,因为我不太了解它。
    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 2015-12-22
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多