以學生和老師為例的來講解多對多映射。
實體類:
Student
package cn.itcast.g_hbm_manyToMany;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; } @Override public String toString() { return "[Student: id=" + id + ", name=" + name + "]"; }}Teacher
package cn.itcast.g_hbm_manyToMany;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; } @Override public String toString() { return "[Teacher: id=" + id + ", name=" + name + "]"; }}映射文件:
Student.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.itcast.g_hbm_manyToMany"> <class name="Student" table="student"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <!-- teachers屬性,Set集合。 表達的是本類與Teacher的多對多。 table屬性:中間表(集合表) key子元素:集合外鍵(引用當前表主鍵的那個外鍵) --> <set name="teachers" table="teacher_student" inverse="false"> <key column="studentId"></key> <many-to-many class="Teacher" column="teacherId"></many-to-many> </set> </class> </hibernate-mapping>
Teacher.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.itcast.g_hbm_manyToMany"> <class name="Teacher" table="teacher"> <id name="id"> <generator class="native"></generator> </id> <property name="name" type="string" column="name"/> <!-- students屬性,Set集合。 表達的是本類與Student的多對多。 --> <set name="students" table="teacher_student" inverse="true"> <key column="teacherId"></key> <many-to-many class="Student" column="studentId"></many-to-many> </set> </class> </hibernate-mapping>
測試
App.java
package cn.itcast.g_hbm_manyToMany;import org.hibernate.session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;import com.java1234.util.HibernateSessionFactory;public class App { private static SessionFactory sessionFactory =HibernateSessionFactory.getSessionFactory(); // 保存,有關聯關系 @Test public void testSave() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // 新建對象 Student student1 = new Student(); student1.setName("王同學1"); Student student2 = new Student(); student2.setName("李同學2"); Teacher teacher1 = new Teacher(); teacher1.setName("趙老師3"); Teacher teacher2 = new Teacher(); teacher2.setName("蔡老師4"); // 關聯起來 student1.getTeachers().add(teacher1); student1.getTeachers().add(teacher2); student2.getTeachers().add(teacher1); student2.getTeachers().add(teacher2); teacher1.getStudents().add(student1); teacher1.getStudents().add(student2); teacher2.getStudents().add(student1); teacher2.getStudents().add(student2); // 保存 session.save(student1); session.save(student2); session.save(teacher1); session.save(teacher2); // -------------------------------------------- session.getTransaction().commit(); session.close(); } // 獲取,可以獲取到關聯的對方 @Test public void testGet() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // 獲取一方,并顯示另一方信息 Teacher teacher = (Teacher) session.get(Teacher.class, 3L); System.out.println(teacher); System.out.println(teacher.getStudents()); // -------------------------------------------- session.getTransaction().commit(); session.close(); } // 解除關聯關系 @Test public void testRemoveRelation() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // 如果inverse=false就可以解除,如果為true就不可以解除 Teacher teacher = (Teacher) session.get(Teacher.class, 3L); teacher.getStudents().clear(); // -------------------------------------------- session.getTransaction().commit(); session.close(); } // 刪除對象,對關聯對象的影響 @Test public void testDelete() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // a, 如果沒有關聯的對方:能刪除。 // b, 如果有關聯的對方且inverse=false,由于可以維護關聯關系,他就會先刪除關聯關系,再刪除自己。 // c, 如果有關聯的對方且inverse=true,由于不能維護關聯關系,所以會直接執行刪除自己,就會有異常。 Teacher teacher = (Teacher) session.get(Teacher.class, 9L); session.delete(teacher); // -------------------------------------------- session.getTransaction().commit(); session.close(); }}
兩張表的多對多關系,在數據庫中通常是通過第三張中間表來實現的,第三張中間表放的是兩張表各自的主鍵值,通過主鍵與主鍵的對應來體現表直接的關系。比如在權限系統中,一個用戶可以擁有多種權限,而一種權限也可以授予多個用戶。
|
新聞熱點
疑難解答