Hibernate讀書筆記—–Hibernate的關聯映射之N-N關聯映射 . – JAVA編程語言程序開發技術文章

四、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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *