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 List<Right> rights;//角色拥有的权限 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<Right> getRights() { return rights; } public void setRights(List<Right> 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 List<Role> roles;
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<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> 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实体配置:
<class name="Role" lazy="true" table="SYS_ROLE">
<id name="role_id">
<generator class="uuid" />
</id>
<property name="role_name"></property>
<property name="cre_time"></property>
<property name="parent_id"></property>
<property name="describe"></property>
<property name="sort"></property>
<bag name="rights" table="role_right">
<key column="role_id"/>
<many-to-many class="Right" column="right_id"/>
</bag>
</class>
Right实体配置:
<class name="Right" lazy="true" table="SYS_RIGHTS">
<id name="right_id">
<generator class="uuid" />
</id>
<property name="right_name"></property>
<property name="url"></property>
<property name="parent_id"></property>
<property name="lev"></property>
<property name="sort"></property>
<bag name="roles" table="role_right">
<key column="right_id"/>
<many-to-many class="Role" column="role_id"/>
</bag>
</class>
二、
第二种实现方式的特点是程序会产生中间表实体,然后在中间表实体中配置两个mang-to-one即可。
这里以学生-成绩-课程举例,成绩类即是中间表实体,记录某一个学生的某一个课程的成绩。在这里第一种方式是不适用于这个例子的,因为第一种方式的中间表只保留两个关联表的主键,而在这里成绩中间表还需要记录学生课程的成绩。
Student类:
public class Student {
private String id;
private String name;
private List<Score> scoreList;
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<Score> getScoreList() {
return scoreList;
}
public void setScoreList(List<Score> 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 List<Score> scoreList;
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<Score> getScoreList() {
return scoreList;
}
public void setScoreList(List<Score> 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实体配置:
<class name="Student" lazy="true" table="student">
<id name="id">
<generator class="uuid" />
</id>
<property name="name"></property>
<bag name="scoreList">
<key column="student"/>
<one-to-many class="Score"/>
</bag>
</class>
Course实体配置:
<class name="Course" lazy="true" table="course">
<id name="id">
<generator class="uuid" />
</id>
<property name="name"></property>
<bag name="scoreList">
<key column="course"/>
<one-to-many class="Score"/>
</bag>
</class>
Score实体配置:
<class name="Score" lazy="true" table="score">
<id name="id">
<generator class="uuid" />
</id>
<property name="score"></property>
<many-to-one name="student" column="student" ></many-to-one>
<many-to-one name="course" column="course" ></many-to-one>
</class>
最后,第二种方式还有一种可能的情况,比如是学生id 和课程id 作为成绩表的联合主键,这时Score实体配置改动如下:
<class name="Score" lazy="true" table="score">
<composite-id>
<key-many-to-one name="student" column="student"></key-many-to-one>
<key-many-to-one name="course" column="course"></key-many-to-one>
</composite-id>
<property name="score"></property>
</class>