Java 这个Hibernate多对多关系实现到底是如何工作的?我的推理正确吗?
我对Hibernate相当陌生,我对这个实现了许多用例的教程示例有一些疑问 我有两个实体类: 1) 电影:Java 这个Hibernate多对多关系实现到底是如何工作的?我的推理正确吗?,java,database,hibernate,hibernate-mapping,rdbms,Java,Database,Hibernate,Hibernate Mapping,Rdbms,我对Hibernate相当陌生,我对这个实现了许多用例的教程示例有一些疑问 我有两个实体类: 1) 电影: @Entity public class Movie { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String name; @ManyToMany(cascade={CascadeType.PERSIST}) @JoinTabl
@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;
}
}
@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;
}
}
@实体
公映{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
@ManyToMany(cascade={CascadeType.PERSIST})
@可接合(
name=“电影演员”,
joinColumns={@JoinColumn(name=“movie_id”)},
inverseJoinColumns={@JoinColumn(name=“actor\u id”)}
)
私有集actors=newhashset();
公共电影(){}
公共电影(字符串名称){
this.name=名称;
}
公共集getActors(){
返回演员;
}
}
2) 演员:
@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;
}
}
@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;
}
}
@实体
公共级演员{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
@许多(mappedBy=“actors”)
private Set movies=new HashSet();
公共参与者(){}
公共参与者(字符串名称){
this.name=名称;
}
公共集getMovies(){
返回电影;
}
}
因此,这意味着一个电影实例可以关联到多个演员(多个演员演一部电影),同时一个演员实例可以关联到多部电影(一个演员可以演多部电影)
因此,Movie类是多对多关系的所有者,因为它包含:
@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>();
@ManyToMany(cascade={CascadeType.PERSIST})
@可接合(
name=“电影演员”,
joinColumns={@JoinColumn(name=“movie_id”)},
inverseJoinColumns={@JoinColumn(name=“actor\u id”)}
)
私有集actors=newhashset();
而Actor类是关系的反向端
这意味着,将在数据库中创建一个电影演员关联表,该表使用电影表和演员表的id来创建关联
这意味着Actor实例不负责更新,因此,如果我添加了一个新的Actor并为其设置了一个电影,则该Actor将插入Actor表,但该关系不会插入movie\u Actor关联表
为此,我必须创建一个新的电影对象,然后在其上设置演员并持久化此电影对象,这样将执行电影表上的电影对象、演员表上的相关演员对象以及电影演员关联表中的相关记录
是我的推理正确还是我遗漏了什么
Tnx“因此,Movie类是多对多关系的所有者,因为它包含…”
否,电影
是所有者,因为演员
包含:
拥有关系的字段。除非关系
是单向的
“要做到这一点,我必须创建一个新的电影对象,然后在其上设置演员并保留此电影对象…”
是的,但它不必是新的电影
,它可以是现有的电影,您可以向其中添加现有或新的演员
实例
关于其他方面,答案是:是的,你的推理是正确的。为什么不试试,然后查询数据库,看看什么时候发生了什么?