Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个Hibernate多对多关系实现到底是如何工作的?我的推理正确吗?_Java_Database_Hibernate_Hibernate Mapping_Rdbms - Fatal编程技术网

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

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

我对Hibernate相当陌生,我对这个实现了许多用例的教程示例有一些疑问

我有两个实体类:

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

}
@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类是多对多关系的所有者,因为它包含…”

否,
电影
是所有者,因为
演员
包含:

拥有关系的字段。除非关系 是单向的

“要做到这一点,我必须创建一个新的电影对象,然后在其上设置演员并保留此电影对象…”

是的,但它不必是新的
电影
,它可以是现有的电影,您可以向其中添加现有或新的
演员
实例


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

为什么不试试,然后查询数据库,看看什么时候发生了什么?