多对多关系:第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。
一般的设计中,多对多关联映射,需要一个中间表 Hibernate使用many-to-many标签来表示多对多 多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的
1、实体
1.1 课程实体
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 学生实体
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、关系映射配置
2.1 课程实体映射
<?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 学生实体映射
<?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>
3、测试添加、删除
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(); } }