Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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@OneToMany注释到底是如何工作的?_Java_Hibernate_Orm_One To Many_Hibernate Mapping - Fatal编程技术网

Java Hibernate@OneToMany注释到底是如何工作的?

Java Hibernate@OneToMany注释到底是如何工作的?,java,hibernate,orm,one-to-many,hibernate-mapping,Java,Hibernate,Orm,One To Many,Hibernate Mapping,我对Hibernate还很陌生,我正在一个教程中学习它。我在理解OneToMany注释的具体工作原理时遇到一些问题 我有两个实体类:Student代表一个学生和Guide代表一个引导学生的人。因此,每个学生都与一个向导关联,但一个向导可以跟随多个学生。我想要一个向导来了解与他有关的学生 因此,我: 学生: @Entity public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) pr

我对Hibernate还很陌生,我正在一个教程中学习它。我在理解OneToMany注释的具体工作原理时遇到一些问题

我有两个实体类:Student代表一个学生和Guide代表一个引导学生的人。因此,每个学生都与一个向导关联,但一个向导可以跟随多个学生。我想要一个向导来了解与他有关的学生

因此,我:

学生

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name="enrollment_id", nullable=false)
    private String enrollmentId;    

    private String name;

    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})
    @JoinColumn(name="guide_id")
    private Guide guide;

    public Student() {}
    public Student(String enrollmentId, String name, Guide guide) {
        this.enrollmentId = enrollmentId;
        this.name = name;
        this.guide = guide;
    }

    public Guide getGuide() {
        return guide;
    }
    public void setGuide(Guide guide) {
        this.guide = guide;
    }

}
因此,引导字段上的@ManyToOne注释:

@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})
@JoinColumn(name="guide_id")
private Guide guide; 
意味着一个向导与一个学生关联,但一个向导可以跟随多个学生。是这样吗?指定的级联设置具体起什么作用?我认为这意味着,当我将包含指南对象作为字段的学生对象持久化时,该指南对象也会自动持久化。当我删除一个学生对象时,也会发生同样的事情,相关的指南记录被删除……但我不是绝对确定

好的,这样做,我将在学生表中的记录和指南表中的记录之间有一个单向关系,因为在学生表中,我将有一个外键加入指南表,这样学生就可以知道它的指南,但是,这样做的话,导游就不知道跟随的学生了……这是不明智的

为此,指南类以以下方式实现:

@Entity
public class Guide {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name="staff_id", nullable=false)
    private String staffId; 

    private String name;
    private Integer salary;

    @OneToMany(mappedBy="guide", cascade={CascadeType.PERSIST})
    private Set<Student> students = new HashSet<Student>(); 

    public Guide() {}
    public Guide(String staffId, String name, Integer salary) {
        this.staffId = staffId;
        this.name = name;
        this.salary = salary;
    }

    public Set<Student> getStudents() {
        return students;
    }   
    public void setSalary(Integer salary) {
        this.salary = salary;
    }

    public void addStudent(Student student) {
        students.add(student);
        student.setGuide(this);
    }

}   

因此,在Student实体类中,我没有定义guide_id字段,但我在数据库的Student表中有它。因此,我认为表中此字段的创建取决于指南实体类中定义的先前的@OneToMany注释。这是正确的还是我遗漏了什么?

是的,您可以定义一个没有双向关联的
@OneToMany
实体,并且添加的列位于数据库中的
Many
实体端(即使实体不知道它链接到
One
实体)

您也可以为此使用联接表,但这不是必需的

@OneToMany(mappedBy="guide", cascade={CascadeType.PERSIST})
private Set<Student> students = new HashSet<Student>(); 
'id', 'bigint(20)', 'NO', 'PRI', NULL, 'auto_increment'
'enrollment_id', 'varchar(255)', 'NO', '', NULL, ''
'name', 'varchar(255)', 'YES', '', NULL, ''
'guide_id', 'bigint(20)', 'YES', 'MUL', NULL, ''