Java的Hibernate框架提供了双向主键关联和双向外键关联两种关联方式,这两种方式有着各自特点和适合的场景。下面将分别对这两种关联方式进行详细解析,并给出相关示例。
双向主键关联
双向主键关联是指关联关系中两个实体类都具有主键,并且相互之间通过持有对方主键的引用来建立关联。双向主键关联可以通过@MapsId和@ManyToOne注解来实现,在Java中通常是使用对象之间的引用来建立关联。
建立双向主键关联的步骤
- 定义主键引用关系
在建立双向主键关联前,需要先在数据表中定义好主键的关系。例如,两张表Student和Teacher都有唯一主键id,现在需要建立Student和Teacher之间的双向主键关联,可以在Teacher表中加入一个外键student_id,以此表明Teacher和Student之间的关联关系。
- 标注@ManyToOne注解
在Student实体类中,标注@ManyToOne注解,定义父实体Teacher的引用,使用@MapsId注解关联Teacher实体类的主键id。
@Entity
public class Student {
// 定义主键
@Id
private Long id;
// 定义引用关系
@ManyToOne
@MapsId("teacherId")
private Teacher teacher;
// 其他属性和方法省略
}
在Teacher实体类中,定义双向关联的子实体Student的集合,使用@OneToMany注解关联Student实体类的引用。
@Entity
public class Teacher {
// 定义主键
@Id
private Long id;
// 定义引用关系
@OneToMany(mappedBy = "teacher")
private Set<Student> students;
// 其他属性和方法省略
}
示例
假设Teacher表中已经存在一条主键id为1的记录,现在需要在Student表中新增一条记录,建立和已有的Teacher记录的双向主键关联。可以使用以下代码实现:
Teacher teacher = session.get(Teacher.class, 1L);
Student student = new Student();
student.setId(2L);
student.setTeacher(teacher);
session.save(student);
双向外键关联
双向外键关联是指关联关系中一方具有主键,另一方具有外键,并且双方通过持有对方的引用来建立关联。双向外键关联可以通过@ManyToOne和@OneToMany注解来实现,在Java中通常是使用对象之间的引用来建立关联。
建立双向外键关联的步骤
- 标注@ManyToOne注解
在子实体Student实体类中,标注@ManyToOne注解,定义父实体Teacher的引用,并在@JoinColumn注解中指定外键对应的字段名。
@Entity
public class Student {
// 定义主键
@Id
private Long id;
// 定义引用关系
@ManyToOne
@JoinColumn(name = "teacher_id")
private Teacher teacher;
// 其他属性和方法省略
}
在父实体Teacher实体类中,定义双向关联的子实体Student的集合,使用@OneToMany注解关联Student实体类的引用,并在@JoinColumn注解中指定外键对应的字段名。
@Entity
public class Teacher {
// 定义主键
@Id
private Long id;
// 定义引用关系
@OneToMany(mappedBy = "teacher")
@JoinColumn(name = "teacher_id")
private Set<Student> students;
// 其他属性和方法省略
}
示例
假设Student表中已经存在一条外键teacher_id为1的记录,现在需要获取对应的Teacher记录,以及Teacher记录所关联的所有的Student记录。可以使用以下代码实现:
Teacher teacher = session.get(Teacher.class, 1L);
Set<Student> students = teacher.getStudents();
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java的Hibernate框架中的双向主键关联与双向外键关联 - Python技术站