gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:43 25 4
gpt4 key购买 nike

我是 Hibernate 的新手,我正在学习教程。我在理解 OneToMany 注释的确切工作原理时遇到了一些问题。

所以我有这 2 个实体类: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;

表示单个向导与单个学生相关联,但向导可以跟随多个学生。这样对吗?指定的cascade 设置究竟有什么作用?我认为这意味着当我持久化一个包含 Guide 对象作为字段的 Student 对象时,这个 Guide 对象也会自动持久化。当我删除一个 Student 对象时,也会发生同样的事情,相关的 Guide 记录也会被删除……但我对此不是很确定……

好的,这样做我将在 Student 表中的记录和 Guide 中的记录之间建立单向关系表,因为在 Student 表中,我将有一个外键来加入 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);
}

}

因此,如您所见,此类包含:

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

它用于声明双向关系。

所以在我看来,这个注释会自动在 Student 表中创建一个 guide_id 字段,代表实现双向的外键关系。

事实上,使用这个映射,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, ''

所以在 Student 实体类中我没有定义 guide_id 字段,但我在数据库的 Student 表中有它。所以我认为表中这个字段的创建依赖于之前在Guide实体类中定义的@OneToMany注解。这是正确的还是我遗漏了什么?

最佳答案

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

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

关于java - Hibernate @OneToMany 注释到底是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31338309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com