多對多關係:第一個表中的一個行能夠與第二個表中的一個或多個行相關。第二個表中的一個行也能夠與第一個表中的一個或多個行相關。java
通常的設計中,多對多關聯映射,須要一箇中間表 Hibernate使用many-to-many標籤來表示多對多 多對多的關聯映射,在實體類中,跟一對多同樣,也是用集合來表示的數據庫
一、實體session
1.1 課程實體app
package demo.entity; import java.util.HashSet; import java.util.Set; /** * 課程實體 * @author Don * @date:日期:2017年4月11日 時間:下午2:25:45* * @version 1.0 */ public class Course { private String id; private String name; //課程中包含的學生列表 private Set<Student> stus = new HashSet<>(); public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Student> getStus() { return stus; } public void setStus(Set<Student> stus) { this.stus = stus; } public Course(){} public Course(String name) { this.setName(name); } }
1.2 學生實體ide
package demo.entity; import java.util.HashSet; import java.util.Set; /** * 學生實體 * @author Don * @date:日期:2017年4月11日 時間:下午2:25:15* * @version 1.0 */ public class Student { private String id; private String name; //學生選的課程列表 private Set<Course> cous=new HashSet<>(); public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Course> getCous() { return cous; } public void setCous(Set<Course> cous) { this.cous = cous; } public Student() { } public Student(String name) { this.setName(name); } }
二、關係映射配置測試
2.1 課程實體映射ui
<?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> <!-- name:實體, table:表名 --> <class name="demo.entity.Course" table="m2m_1_course"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- 生成主鍵--> <generator class="uuid"></generator> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <!-- 使用中間表的數據構建集合 --> <set name="stus" table="m2m_1_stu_cour" cascade="save-update"> <!-- 中間表中記錄當前類的列 --> <key column="cid"></key> <many-to-many class="demo.entity.Student" column="stuid"></many-to-many> </set> </class> </hibernate-mapping>
2.2 學生實體映射this
<?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> <!-- 在這個一對一的關係中,Person能夠本身產生主鍵值 --> <!-- name:實體, table:表名 --> <class name="demo.entity.Student" table="m2m_1_student"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- Hibernate使用generator類來生成主鍵 --> <generator class="uuid" /> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <!-- 使用中間表的數據構建集合 --> <set name="cous" table="m2m_1_stu_cour" cascade="save-update"> <!-- 中間表中記錄當前類的列 --> <key column="stuid"></key> <many-to-many class="demo.entity.Course" column="cid"></many-to-many> </set> </class> </hibernate-mapping>
三、測試添加、刪除spa
package demo.test; import org.hibernate.classic.Session; import demo.entity.Course; import demo.entity.Student; import demo.util.HibernateUtil; public class TestSave { public static void main(String[] args) { Student stu1 = new Student("張三"); Student stu2 = new Student("李四"); Student stu3 = new Student("王五"); Course c1 = new Course("C#"); Course c2 = new Course("JAVA"); Course c3 = new Course("PHP"); Course c4 = new Course("Object-C"); //學生添加選課 stu1.getCous().add(c1); stu1.getCous().add(c2); stu2.getCous().add(c2); stu2.getCous().add(c4); stu3.getCous().add(c1); stu3.getCous().add(c2); stu3.getCous().add(c3); stu3.getCous().add(c3); Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); session.save(stu1); session.save(stu2); session.save(stu3); /*再次添加選課*/ //學生記錄 Student stu = (Student)session.get(Student.class, "2"); //課程記錄 Course course= (Course)session.get(Course.class, "1"); stu.getCous().add(course); session.update(stu); /*刪除選課*/ //學生記錄 Student stuDelete = (Student)session.get(Student.class, "2"); //課程記錄 Course couDelete= (Course)session.get(Course.class, "1"); stuDelete.getCous().remove(couDelete); session.update(stuDelete); //刪除學生記錄 session.delete(stuDelete); session.getTransaction().commit(); } }