这个Hibernate Many To Many关系的实现究竟如何?这是我的推理正确吗?

时间:2015-07-14 13:32:04

标签: java database hibernate hibernate-mapping rdbms

我是Hibernate的新手,我对这个实现 ManyToMany 用例的教程示例有些怀疑。

所以我有这两个实体类:

1)电影

@Entity
public class Movie {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToMany(cascade={CascadeType.PERSIST})
    @JoinTable(
                    name="movie_actor",
                    joinColumns={@JoinColumn(name="movie_id")},
                    inverseJoinColumns={@JoinColumn(name="actor_id")}
        )

    private Set<Actor> actors = new HashSet<Actor>();   

    public Movie() {}
    public Movie(String name) {
        this.name = name;
    }

    public Set<Actor> getActors() {
        return actors;
    }

}

2)演员

@Entity
public class Actor {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

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

    public Actor() {}   
    public Actor(String name) {
        this.name = name;
    }

    public Set<Movie> getMovies() {
        return movies;
    }
}

所以这意味着电影实例可以与许多演员关联(许多演员扮演单个电影),同时可以关联 Actor 实例许多电影(一个演员可以在很多电影中演出)。

所以电影类是多对多关系的所有者,因为它包含:

@ManyToMany(cascade={CascadeType.PERSIST})
@JoinTable(
                name="movie_actor",
                joinColumns={@JoinColumn(name="movie_id")},
                inverseJoinColumns={@JoinColumn(name="actor_id")}
    )

private Set<Actor> actors = new HashSet<Actor>();   

Actor 类是关系的反向结束

这意味着,在数据库中,将创建一个 movie_actor 关联表,该关联表使用电影表和 Actor 表的ID创造关系。

这意味着 Actor 实例不对更新负责,所以如果我添加一个新的actor并且我为它设置了一个电影,那么actor将被插入 Actor < / strong>表但该关系未插入 movie_actor 关联表。

要做到这一点,我必须创建一个新的电影对象,然后在其上设置演员并保留此电影对象,这样就会以这种方式执行电影Movie表上的对象,Actor表上的相关Actor对象以及 movie_actor 关联表中的相关记录。

我的推理是正确还是我错过了什么?

TNX

1 个答案:

答案 0 :(得分:1)

“所以Movie类是多对多关系的所有者,因为它包含......”

不,Movie是所有者,因为Actor包含mappedBy

  

拥有这种关系的领域。除非关系必须要求   是单向的。

“要做到这一点,我必须创建一个新的Movie对象,然后在其上设置actor并保留此Movie对象......”

是的,但它不一定是新的Movie,它可以是现有的Actor个实例。

关于其他一切,答案是:是的,你的推理是正确的。