《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现
这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多、多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下。
先考虑数据库表
1、学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键
2、课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键
3、分数表
分数表有两种解决方案
3.1 第一种为:使用联合主键:student_id 和 course_id
3.2 第二种:不使用联合主键,而使用id作为主键
在这里,这篇博文所采取的方法是采用第二种方法:即不使用联合主键,使用id作为主键
在考虑实体类,以及它们的映射关系
一个学生可以选择多个课程,一个课程可以被多个学生选择,即学生和课程是一个多对多的关系。而一个学生可以有多个分数,因此,分数与学生是多对一的关系,同理,分数与课程也是多对一的关系。
下面开始设计
Student实体与Course类之间时多对多的关系,但是,一般情况下,我们需要通过学生来获取他的全部课程,因此,我们需要这样一个导向,有时,我们也需要通过课程,来提取选择这门课的学生,因此,我们建立双向关联。
Student类
@Entity
public class Student {
private int id;
private String name;
/*
* Student和Course是多对多的关系,
* 由于我们一般需要通过Student来获取Course,而不需要通过Course来获取Student,
* 因此我们建立一个单向导向
* */
private Set<Course> courses=new HashSet<Course>();
@ManyToMany(cascade=CascadeType.ALL)
//设置中间表,中间表必须的名称必须与Score一致
@JoinTable(name = "score",
joinColumns = @JoinColumn(name="student_id"),
inverseJoinColumns = @JoinColumn(name="course_id")
)
public Set<Course> getCourses() {