我是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
答案 0 :(得分:1)
“所以Movie类是多对多关系的所有者,因为它包含......”
不,Movie
是所有者,因为Actor
包含mappedBy
:
拥有这种关系的领域。除非关系必须要求 是单向的。
“要做到这一点,我必须创建一个新的Movie对象,然后在其上设置actor并保留此Movie对象......”
是的,但它不一定是新的Movie
,它可以是现有的Actor
个实例。
关于其他一切,答案是:是的,你的推理是正确的。