当我们使用Hibernate时,通过JPA批注,我们能够像对待对象一样管理两个表之间的关系。 这使得使用应用程序对象模型映射数据库属性更加容易。 根据业务逻辑和建模方式,我们可以创建单向或双向关系。
@OneToOne (bidirectional)
下图显示了我们的数据库模型。 student_id是指向学生的外键(从现在开始为FK)。
首先,我们应该问自己是关系的所有者。 这将告诉我们FK应该在哪里。 一个学生与一个学费相关联,而该学费与一个独特的学生相关联。
一个好的做法是在父实体中使用级联,以便我们可以传播更改并将其应用到子级。 在我们的示例中,如果学生不存在,存在学费就没有意义,因此,学生将扮演家长角色。
如果我们看一下以前的图像,我决定补习FK。 我们可以认为,作为关系的所有者,该FK的所有者(所有者)和学生的学费,该关系的非所有者(非所有者)是学费。 但是,如果学生想拥有学费属性,如何创建双向关系? 我们可以考虑在学生方面再增加一个FK,但这会在我们的数据库模型中造成不必要的重复。 为了正确地映射两个实体,我们可以使用注释@JoinColumn和maptedBy。
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.LAZY)
private Tuition tuition;
/* Getters and setters */
}
@Entity
@Table(name = "tuition")
public class Tuition {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Double fee;
//what column in Tuition table has the FK
@JoinColumn(name = "student_id")
@OneToOne(fetch = FetchType.LAZY)
private Student student;
/* Getters and setters */
}
@JoinColumn显示我们要在学费表中指向的列名。 使用MappedBy,我们可以创建双向关系,即使我们只有一个FK,也可以链接两个表。 最后,这些注释的主要目标是确保映射关系的键在哪里。