这个 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
实例。
关于其他一切,答案是:是的,你的推理是正确的。
我是 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
实例。
关于其他一切,答案是:是的,你的推理是正确的。