hibernate学习笔记(多对多关联关系)

来源:互联网 发布:数据库的安全性设计 编辑:程序博客网 时间:2024/06/05 09:22

多对多关联关系:本质上就是两个一对多的关系,

例如:一个学生可以选择多门课程。一门课程可以被很多学生选择。

体现在代码中如下;学生类:

private String id;//学生idprivate String name;//学生姓名private Set<Course> course;//学生选择的课程集合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> getCourse() {return course;}public void setCourse(Set<Course> course) {this.course = course;}
课程类:

private String id;//课程idprivate String name;//课程名称private Set<Student> student;//学生集合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> getStudent() {return student;}public void setStudent(Set<Student> student) {this.student = student;}
关键就是两个映射文件了。

student.hbm.xml映射文件

<class name="com.test.bean1.Student" table="student"><id name="id" column="id" type="string"><generator class="uuid"/></id><property name="name" column="name" type="string"/><set name="course" table="student_course" cascade="save-update" ><key column="student_id"/><!-- 这个student_id是中间关联表的id,根据这个id可以关联到student表 --><!-- class:表示关联的类型。column:表示根据course_id可以关联到course表 --><many-to-many class="com.test.bean1.Course" column="course_id" /></set></class>
course.hbm.xml映射文件;

<class name="com.test.bean1.Course" table="course"><id name="id" column="id" type="string"><generator class="uuid"/></id><property name="name" column="name" type="string"/><!-- 这里的配置和上面的一样,有一点就是inverse为true;表示对方维护这种关联关系。为false:表示主动方;由主动方维护这种关联关系 --><set name="student" table="student_course" cascade="save-update" inverse="true" ><key column="course_id"/><many-to-many class="com.test.bean1.Student" column="student_id"  /></set></class>
最后来个测试吧:

Session session=sessionfactory.openSession();Transaction tx=null;//Student student=new Student();//student.setName("zhangsan");//student.setCourse(new HashSet<Course>());////Course course=new Course();//course.setName("英语");//course.setStudent(new HashSet<Student>());////添加记录//student.getCourse().add(course);//course.getStudent().add(student);//try {tx=session.beginTransaction();//查询到张三学生。没用延迟加载。所以把对应的课程表的信息也查出来了。Student student=(Student)session.get(Student.class, "4028ab81385bdd9b01385bdd9d030001");//查询到数学这门课程//Course course=(Course)session.get(Course.class, "4028ab81385be0c001385be0c2db0002");//删除信息//student.getCourse().remove(course);//已经查询到了张三的信息。和数学课程的信息。所以可以讲数学这门课程让张三选中//student.getCourse().add(course);//course.getStudent().add(student);//遍历张三学生的所选课程Set<Course> course=student.getCourse();for(Iterator<Course> iter=course.iterator();iter.hasNext();){System.out.println(iter.next().getName());}tx.commit();} catch (Exception e) {if(null!=tx)tx.rollback();e.printStackTrace();}finally{session.close();}
省略了获取session的代码了。