四、N—N關聯關系
1.1單向N-N的關聯
單向的N-N關聯和1-N關聯的持久化類完全一樣,控制關系的一端需要增加一個set集合屬性,被關聯的持久化實例以集合的形式存在。
N-N關聯必須使用連接表,N-N關聯與有連接表的1-N關聯非常相似,隻需要去掉<many-to-many…/>元素的unique="true"即可。其他的配置和1-N關聯一樣。
由於與1-N關聯非常相似,這裡就不演示瞭。
1.2雙向N-N的關聯
對於雙向的N-N關聯,我們隻需要轉換為兩個1-N關聯模型即可。雙向N-N關聯兩端都需要使用set集合屬性,兩端都增加對集合屬性的訪問。雙向N-N同樣必須使用連接表來建立兩個實體之間的關聯關系。
以學生、老師為例:下面為兩個實體的持久化類:
Student
[java]
public class Student {
private Integer id;
private String name;
private Set<Teacher> teachers;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
Teacher
[java]
public class Teacher {
private Integer id;
private String name;
private Set<Student> students;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
雙向N-N關聯的映射文件需要使用<set…/>元素,用以映射集合屬性。<set…/>屬性還需要增加<key…/>子元素來映射外鍵列,同時還應該增加<many-to-many…/>子元素來映射關聯實體類。兩個映射文件如下:
Student.hbm.xml
[html]
<hibernate-mapping package="com.hibernate.domain">
<class name="Student" table="student">
<id name="id" column="student_id">
<generator class="native" />
</id>
<property name="name" column="student_name" />
<!– 映射N-N關聯實體,兩邊的table應該以樣 –>
<set name="teachers" table="student_teacher">
<!– 映射關聯的外鍵 列–>
<key column="student_id" />
<!– 映射關聯類屬性 –>
<many-to-many class="Teacher" column="teacher_id" />
</set>
</class>
</hibernate-mapping>
Teacher.hbm.xml
[html] view plaincopyprint?
<hibernate-mapping package="com.hibernate.domain">
<class name="Teacher" table="teacher">
<id name="id" column="teacher_id">
<generator class="native" />
</id>
<property name="name" column="teacher_name" />
<!– 映射N-N關聯實體,兩邊的table應該以樣 –>
<set name="students" table="student_teacher">
<!– 映射關聯的外鍵 列–>
<key column="teacher_id" />
<!– 映射關聯類屬性 –>
<many-to-many class="Student" column="student_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
雙向N-N關聯的雙邊都需要指定連接表的表名,外鍵列的列名,所以兩個<set…/>元素的table屬性的值必須指定且一樣。<set…/>元素的兩個子元素:<key../>、<many-to-many…/>都必須指定column屬性。<key…/>和<many-to-many…/>分別是指定本持久化類、關聯類在連接表中的外鍵列。因此兩邊的<key…/>和<many-to-many…/>的column屬性的值應該是交叉相等。
通過下面的操作類來添加兩個Student對象和兩個Teacher對象
[java]
static void add(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Teacher teacher1 = new Teacher();
teacher1.setName("teacher1");
Teacher teacher2 = new Teacher();
teacher2.setName("teacher2");
Student student1 = new Student();
student1.setName("student1");
Student student2 = new Student();
student2.setName("student2");
//建立兩者之間的關系
Set<Student> ss = new HashSet<Student>();
ss.add(student1);
ss.add(student2);
teacher1.setStudents(ss);
teacher2.setStudents(ss);
session.save(teacher1);
session.save(teacher2);
session.save(student1);
session.save(student2);
tx.commit();
session.close();
}
註意:這裡隻能由一邊建立關聯關系,就是說隻能由Student對象建立與Teacher對象的關聯或者由Teachert對象建立與Student對象的關聯。否則將會出現主鍵重復錯誤
作者:chenssy