下面就用学生和老师的关系来说明下,一个学生可以对应多个老师,而一个老师同时也可以教很多学生,这就是一个多对多的关系,映射多对多的关系通常要第三张表在存储二者的关系,在又向的多对多映射中,学生会持有一个老师的集合,表明学生的老师有哪些;老师也会持有学生的一个集合,表明老师所教的学生有哪些。
代码如下:
package fantasy0707.hibernate.model; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; @Entity public class Student { private int id; private String name; private Setteachers = new HashSet (); @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany(mappedBy="students") public Set getTeachers() { return teachers; } public void setTeachers(Set teachers) { this.teachers = teachers; } }
package fantasy0707.hibernate.model; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; @Entity public class Teacher { private int id; private String name; private Setstudents = new HashSet (); @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany @JoinTable( name="t_s", joinColumns=@JoinColumn(name="t_id"), inverseJoinColumns=@JoinColumn(name="s_id") ) public Set getStudents() { return students; } public void setStudents(Set students) { this.students = students; } }
会生成的表有student,teacher,t_s,其中t_s的结构如下:
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| t_id | int(11) | NO | PRI | NULL | |
| s_id | int(11) | NO | PRI | NULL | |
+-------+---------+------+-----+---------+-------+
(老手就不要看了,新手参考就成)