hibernate多对多关系配置
hibernate关系映射配置方式有两种,一种是配置文件方式,一种则是注解配置方式,这次本文讲解的是配置文件的方式。
在hibernate中多对多关系也有两种实现方式:
一、
第一种,直接配置mang-to-many的多对多关系,这种方式的特点是中间表只有两个字段,分别是两个关联表的主键,而程序中也不会产生中间表的实体。
这里以Role角色-Right权限为例,一个角色有多个权限 ,一个权限也可以被赋予给多个角色。
Role类:
public class Role{ private String role_id; //角色id private String role_name;//角色名称 private Date cre_time;//创建时间 private String parent_id;//父级角色 private String describe;//描述 private int sort;//序号 private Listrights;//角色拥有的权限 public String getRole_id() { return role_id; } public void setRole_id(String roleId) { role_id = roleId; } public String getRole_name() { return role_name; } public void setRole_name(String roleName) { role_name = roleName; } public Date getCre_time() { return cre_time; } public void setCre_time(Date creTime) { cre_time = creTime; } public String getParent_id() { return parent_id; } public void setParent_id(String parentId) { parent_id = parentId; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } public int getSort() { return sort; } public void setSort(int sort) { this.sort = sort; } public List getRights() { return rights; } public void setRights(List rights) { this.rights = rights; } @Override public String toString() { return "Role [cre_time=" + cre_time + ", describe=" + describe + ", parent_id=" + parent_id + ", role_id=" + role_id + ", role_name=" + role_name + ", sort=" + sort + "]"; } }
Right类:
public class Right{ private String right_id;//权限id private String right_name;//权限名称 private String url;//权限URL private String parent_id;//父级权限 private int lev;//权限等级 private int sort;//序号 private Listroles; public String getRight_id() { return right_id; } public void setRight_id(String rightId) { right_id = rightId; } public String getRight_name() { return right_name; } public void setRight_name(String rightName) { right_name = rightName; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getParent_id() { return parent_id; } public void setParent_id(String parentId) { parent_id = parentId; } public int getLev() { return lev; } public void setLev(int lev) { this.lev = lev; } public int getSort() { return sort; } public void setSort(int sort) { this.sort = sort; } public List getRoles() { return roles; } public void setRoles(List roles) { this.roles = roles; } @Override public String toString() { return "Right [lev=" + lev + ", parent_id=" + parent_id + ", right_id=" + right_id + ", right_name=" + right_name + ", sort=" + sort + ", url=" + url + "]"; } }
Role实体配置:
Right实体配置:
二、
第二种实现方式的特点是程序会产生中间表实体,然后在中间表实体中配置两个mang-to-one即可。
这里以学生-成绩-课程举例,成绩类即是中间表实体,记录某一个学生的某一个课程的成绩。在这里第一种方式是不适用于这个例子的,因为第一种方式的中间表只保留两个关联表的主键,而在这里成绩中间表还需要记录学生课程的成绩。
Student类:
public class Student { private String id; private String name; private ListscoreList; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List getScoreList() { return scoreList; } public void setScoreList(List scoreList) { this.scoreList = scoreList; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
Course类:
public class Course { private String id; private String name; private ListscoreList; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List getScoreList() { return scoreList; } public void setScoreList(List scoreList) { this.scoreList = scoreList; } @Override public String toString() { return "Course [id=" + id + ", name=" + name + "]"; } }
Score类:
public class Score { private String id;//主键id private Student student;//学生id private Course course;//课程id private int score;//成绩 public String getId() { return id; } public void setId(String id) { this.id = id; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public String toString() { return "Score [course=" + course.getName() + ", score=" + score + ", student=" + student.getName() + "]"; } }
Studnet实体配置:
Course实体配置:
Score实体配置:
最后,第二种方式还有一种可能的情况,比如是学生id 和课程id 作为成绩表的联合主键,这时Score实体配置改动如下: