多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Hibernate關聯關系映射之多對多關聯關系

Hibernate關聯關系映射之多對多關聯關系

來源:程序員人生   發布時間:2014-10-03 08:00:00 閱讀次數:2534次
本次仍然使用一個示例的方式進行演示,學生與教師之間的關系就是一個典型的多對多關系,一個教師可以有多個學生,同樣一個學生也可以有多個教師。在數據庫中存儲需要一張學生表存儲學生信息,一個教師表存儲教師信息,為了表示他們之間的關系我們需要一個中間表來表示他們之間的聯系。

例如,在教師表中有id,name兩個屬性,學生表中同樣有id,name兩個屬性。教師表中有兩條記錄分別是(1,董老師),(2,李老師);學生表中同樣有兩條(1,張三),(2,李四)。在中間表中有兩個字段(teacherId,studentId),這兩個字段構成一個聯合主鍵,同時這兩個字段又是教師表和學生表的外鍵,老師和學生進行關聯的時候直接插入關聯的老師和學生的id在中間表內即可,例如在中間表中插入(1,1)表示董老師與張三進行關聯,插入(1,2)表示董老師與李四關聯。

下面我們看一下Teacher類和Student類

package entity; import java.util.HashSet; import java.util.Set; public class Teacher { private Long id; private String name; private Set<Student> students = new HashSet<Student>(); public Long getId() { return id; } public void setId(Long 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; } }
package entity; import java.util.HashSet; import java.util.Set; public class Student { private Long id; private String name; private Set<Teacher> teachers = new HashSet<Teacher>(); public Long getId() { return id; } public void setId(Long 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; } }

在POJO類中仍然使用集合表示有多條記錄。

下面在看一個他們的映射配置文件

首先看Teacher.hbm.xml

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="entity.Teacher" table="Teacher" schema="MYHR"> <id name="id" type="long"> <column name="ID"/> <generator class="assigned" /> </id> <property name="name" type="string"> <column name="NAME" not-null="true" /> </property> <!-- students屬性,Set集合,表示本類與Student類的多對多關系 --> <set name="students" table="teacher_student" inverse="false"> <key column="teacherId" /> <many-to-many class="entity.Student" column="studentId"/> </set> </class> </hibernate-mapping>

類中的Set類型的屬性在映射配置文件中仍然使用<set>標簽進行映射,在<set>標簽中使用<many-to-many>表示他們之間的關系是多對多。

然后看Student.hbm.xml

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="entity.Student" table="Student" schema="MYHR"> <id name="id" type="long"> <column name="ID" /> <generator class="assigned" /> </id> <property name="name" type="string"> <column name="NAME" not-null="true" /> </property> <!-- teachers屬性, Set集合,表示本類與Teacher類的多對多關聯關系--> <!-- table:是實現多對多映射的中間表 --> <!-- key:集合外鍵(引用當前表主鍵的那個外鍵) --> <set name="teachers" table="teacher_student"> <key column="studentId" /> <many-to-many class="entity.Teacher" column="teacherId"/> </set> </class> </hibernate-mapping>

這樣,教師和學生之間的多對多關聯映射就配置完了,下面看一下測試類。這里使用JUtil進行測試

package test; import static org.junit.Assert.*; import java.util.Iterator; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import entity.Student; import entity.Teacher; import factory.HibernateSessionFactory; public class Test { private Session session = null; private Transaction tran = null; // 存儲對象 @org.junit.Test public void save() { session = HibernateSessionFactory.getSession(); tran = session.beginTransaction(); try { Teacher teacher = new Teacher(); teacher.setId(1L); teacher.setName("董老師"); Teacher t2 = new Teacher(); t2.setId(2l); t2.setName("李老師"); Student s1 = new Student(); s1.setId(1L); s1.setName("李四"); Student s2 = new Student(); s2.setId(2l); s2.setName("張三"); teacher.getStudents().add(s1); teacher.getStudents().add(s2); t2.getStudents().add(s1); t2.getStudents().add(s2); s1.getTeachers().add(teacher); s1.getTeachers().add(t2); s2.getTeachers().add(teacher); s2.getTeachers().add(t2); session.save(teacher); session.save(t2); session.save(s1); session.save(s2); tran.commit(); } catch (Exception e) { tran.rollback(); } } // 獲取老師信息 @org.junit.Test public void GetTeacher() { session = HibernateSessionFactory.getSession(); tran = session.beginTransaction(); try { Teacher teacher = (Teacher) session.get(Teacher.class, 1l); Set<Student> set = teacher.getStudents(); System.out.println(teacher.getName() + "的學生是:"); Iterator<Student> it = set.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName()); } tran.commit(); } catch (Exception e) { tran.rollback(); } } // 解除關聯關系 @org.junit.Test public void RemoveRelation() { session = HibernateSessionFactory.getSession(); tran = session.beginTransaction(); try { Student s = (Student) session.get(Student.class, 1l); Teacher teacher = (Teacher) session.get(Teacher.class, 1l); // 如果Teacher的inverse屬性為false可以解除,如果為true不可以解除 teacher.getStudents().remove(s); tran.commit(); } catch (Exception e) { tran.rollback(); } } // 刪除關聯關系 @org.junit.Test public void DeleteRelation() { session = HibernateSessionFactory.getSession(); tran = session.beginTransaction(); try { Teacher teacher = (Teacher) session.get(Teacher.class, 2l); // 當teacher的inverse屬性為false時,可以將教師信息刪除,并且將中間表中相關記錄刪除 // 當inverse屬性為true時將教師信息刪除時拋出異常 session.delete(teacher); tran.commit(); } catch (Exception e) { tran.rollback(); } } }


 

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲 成人 欧美 自拍 | 欧美亚洲高清日韩成人 | 成人a级高清视频在线观看 成人a毛片高清视频 | 正在播放国产精品放孕妇 | 亚洲国产成人在线观看 | 亚洲第3页 | 在线亚洲一区二区 | 中文国产成人精品久久久 | www.黄色一片| 夜夜未满十八勿进的爽爽影院 | 亚洲精品中文字幕字幕 | 亚洲成av人片在线观看 | 欧美一区二区三区在线可观看 | 国产一区二区自拍视频 | japanese日本护士xx在线 | 国产区图片区小说区亚洲区 | 亚洲永久精品免费www52zcm男男 | 日本免费第一区二区三区 | 国产精品国产三级国产专区5o | 亚洲欧美国产毛片在线 | 性欧美大战久久久久久久 | 亚洲一区二区高清 | 波多野结衣被强在线视频 | 欧美高清视频一区 | 欧美日韩一级黄色片 | 国产三级在线播放 | 第一国内永久免费福利视频 | 亚洲资源在线播放 | 久久久全国免费视频 | 国内精品久久久久影院不卡 | 我想看一级毛片 | 精品国产日韩亚洲一区在线 | 欧美一级aⅴ毛片 | 亚洲一成人毛片 | jizz中国18 | 亚洲国产成a人v在线 | 欧美大尺寸 | 欧美成人一区二区三区在线视频 | 91美女在线 | 真性中出 | 亚洲精品www久久久久久久软件 |