单向关联

  • 学生和课程是多对多的关系,一个学生能选多门课程,一门课程也可能被多人选中。
  • 单向关联指只有学生类中包含课程类,只在学生映射文件中配置一张中间表的映射
  • 获取时只能从根据学生信息获取课程表,不能反过来

    //学生类
    public class Student {
    
        private int id;
        private String name;
        private Set<Course> courses=new HashSet<Course>();
    }
    
    //课程类
    public class Course {
    
        private int id;
        private String name;
    }
    
    //学生映射文件
    <set name="courses" table="student_course" cascade="save-update"> 
        <key column="student_id"></key> <!--这个主键关联t_student的主键-->
        <many-to-many class="com.java1234.model.Course" column="course_id"></many-to-many> <!--这个主键course_id关联的是Course这张表的主键-->
    </set>
    
    //课程映射表
    <class name="Course" table="t_course">
    
        <id name="id" column="courseId">
            <generator class="native"></generator>
        </id>
    
        <property name="name" column="courseName"></property>
    
        <!--学生表与课程表的关联是单向的,所以课程表不需要映射学生表,也无法通过课程来获取学生信息-->
    
    </class>
    
    • 数据库

      /**

      • 只在学生映射文件中配置课程映射,只能通过学生表获取课程表,不能反向
        */
        @Test
        public void testLoad1(){
        Student student=(Student)session.get(Student.class, 1);
        Set courses=(Set)student.getCourses();
        Iterator it=courses.iterator();
        while(it.hasNext()){
        Course c=(Course)it.next();
        System.out.println(c.getName());
        
        }
        }

        双向关联

  • 学生类中包含课程集合,课程类中也包含学生集合
  • 同时在学生和课程映射文件中配置中间数据库
  • 可以反向获取

    //学生类
    public class Student2 {
    
        private int id;
        private String name;
        private Set<Course2> courses=new HashSet<Course2>();
    }
    
    //课程类
    public class Course2 {
    
        private int id;
        private String name;
        private Set<Student2> students=new HashSet<Student2>();
    }
    
    //学生映射文件
    <set name="courses" table="student_course2" cascade="save-update"> 
        <key column="student_id"></key> <!--这个主键关联t_student的主键-->
        <many-to-many class="com.java1234.model.Course2" column="course_id"></many-to-many> <!--这个主键course_id关联的是Course这张表的主键-->
    </set>
    
    //课程映射文件
    <set name="students" table="student_course2" inverse="true">
        <key column="course_id"></key>
        <many-to-many class="com.java1234.model.Student2" column="student_id"></many-to-many>
    </set>
    
    • 数据库同上
/**
* 双向关联,可以反向获取
*/
@Test
public void testLoad2(){
    Course2 course=(Course2)session.get(Course2.class, 1);
    Set<Student2> students=(Set<Student2>)course.getStudents();
    Iterator it=students.iterator();
    while(it.hasNext()){
        Student2 s=(Student2)it.next();
        System.out.println(s.getName());
    }

}

代码实例

  • HibernateManyToMany