这个 Hibernate 多对多关系实现到底是如何工作的?我的推理正确吗?

How exactly works this Hibernate Many To Many relation implementation? Is it my reasoning correct?

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

所以我有这 2 个实体 classes:

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

所以这意味着一个 Movie 实例可以关联到许多演员(许多演员在一部电影中表演),同时一个 Actor instance can be associated to many movie(一个演员可以演多部电影)。

因此 Movie class 是多对多关系 的所有者,因为它包含:

@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 class 是关系.

反端

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

这意味着 Actor 实例不负责更新,所以如果我添加一个新演员并为其设置电影,该演员将被插入到Actor table 但关系未插入 movie_actor 关联 table.

为此,我必须创建一个新的 Movie 对象,然后在其上设置演员并保留此 Movie 对象,所以这样就会执行Movie上的Movie对象table,Actor上的相关Actor对象table,相关的记录到movie_actor[=55=中]协会table.

是我的推理正确还是我遗漏了什么?

Tnx

"So the Movie class is the owner of the many to many relation because it contains..."

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

The field that owns the relationship. Required unless the relationship is unidirectional.

"To do it I have to create a new Movie object, then set the actors on it and persist this Movie object..."

是的,但它不一定是新的 Movie,它可以是现有的,您可以向其中添加现有的或新的 Actor 实例。

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