zoukankan      html  css  js  c++  java
  • Hibernate学习8—Hibernate 映射关系(多对多)

    第二节:Hibernate 多对多映射关系实现                                      
     
    比如学生和课程是多对多的关系;
    一个学生可以选多个课程;
    一个课程可以被多个学生选中,所以是多对多的关系;
     
    1,多对多单向实现:                            
    单向关系:
    这里通过学生可以获取这个学生选修的课程;
    但是通过课程无法获取选修这门课程的学生;
     
    Student.java:
    package com.cy.model;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Student {
        private int id;
        private String name;
        private Set<Course> courses = new HashSet<Course>();
        
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Set<Course> getCourses() {
            return courses;
        }
        public void setCourses(Set<Course> courses) {
            this.courses = courses;
        }
        
        
    }
    View Code

    Course.java:

    package com.cy.model;
    
    public class Course {
        private int id;
        private String name;
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        
    }
    View Code

    Student.hbm.xml:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.cy.model">
    
        <class name="Student" table="t_student">
            <id name="id" column="studentId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="studentName"></property>
            
            <!-- 多对多没法用两个表来实现,必须借助第三张表,中间表(student_course)
                 key column="student_id"表示学生课程表中的一个外键student_id关联学生表的主键
             -->
            <set name="courses" table="student_course" cascade="save-update">
                <key column="student_id"></key>
                <!-- many to many映射的另外一张表
                     student_course的外键course_id关联course表的主键
                 -->
                <many-to-many class="com.cy.model.Course" column="course_id"></many-to-many>
            </set>
        </class>
    
    </hibernate-mapping>
    View Code

    Course.hbm.xml:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.cy.model">
    
        <class name="Course" table="t_course">
            <id name="id" column="courseId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="courseName"></property>
        </class>
    
    </hibernate-mapping>
    View Code

    测试代码:

    StudentTest.java:

    package com.cy.service;
    
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.cy.model.Course;
    import com.cy.model.Student;
    import com.cy.util.HibernateUtil;
    
    public class StudentTest {
    
        private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
        private Session session;
        
        @Before
        public void setUp() throws Exception {
            session=sessionFactory.openSession(); 
            session.beginTransaction();
        }
    
        @After
        public void tearDown() throws Exception {
             session.getTransaction().commit();
             session.close();
        }
    
        @Test
        public void testSave1(){
            Course course1=new Course();
            course1.setName("语文");
            
            Course course2=new Course();
            course2.setName("数学");
            
            Student student1=new Student();
            student1.setName("张三");
            student1.getCourses().add(course1);
            student1.getCourses().add(course2);
            
            Student student2=new Student();
            student2.setName("李四");
            student2.getCourses().add(course1);
            student2.getCourses().add(course2);
            
            session.save(student1);
            session.save(student2);
        }
        
        /**
         * 获取张三选修的课程
         */
        @Test
        public void testLoad1(){
            Student s = (Student) session.get(Student.class, 1);
            Set<Course> courses = s.getCourses();
            for(Course course : courses) {
                System.out.println(course.getName());
            }
        }
    }
    View Code

    查看生成的表结构:

    student_course的建表语句:

    插入数据后:

    t_student:

     

    t_course:

    student_course:

    2,多对多双向实现:                                          

    通过学生可以获取这个学生选修的课程;
    通过课程可以获取选修这门课程的学生;

     Student2.java:

    package com.cy.model;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Student2 {
        private int id;
        private String name;
        private Set<Course2> courses = new HashSet<Course2>();
        
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Set<Course2> getCourses() {
            return courses;
        }
        public void setCourses(Set<Course2> courses) {
            this.courses = courses;
        }
        
        
    }
    View Code

    Course2.java:

    package com.cy.model;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Course2 {
        private int id;
        private String name;
        private Set<Student2> students = new HashSet<Student2>();
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Set<Student2> getStudents() {
            return students;
        }
        public void setStudents(Set<Student2> students) {
            this.students = students;
        }
        
        
    }
    View Code

    Student2.hbm.xml:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.cy.model">
    
        <class name="Student2" table="t_student2">
            <id name="id" column="studentId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="studentName"></property>
            
            <set name="courses" table="student_course2" cascade="save-update">
                <key column="student_id"></key>
                <many-to-many class="com.cy.model.Course2" column="course_id"></many-to-many>
            </set>
        </class>
    
    </hibernate-mapping>
    View Code

    Course2.hbm.xml:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.cy.model">
    
        <class name="Course2" table="t_course2">
            <id name="id" column="courseId">
                <generator class="native"></generator>
            </id>
            <property name="name" column="courseName"></property>
            
            <!-- inverse=true: 在双向关系中,由学生端来维护关联关系 -->
            <set name="students" table="student_course2" inverse="true">
                <key column="course_id"></key>
                <many-to-many class="com.cy.model.Student2" column="student_id"></many-to-many>
            </set>
        </class>
    
    </hibernate-mapping>
    View Code

    测试代码:

    @Test
        public void testSave2(){
            Course2 course1=new Course2();
            course1.setName("语文");
            
            Course2 course2=new Course2();
            course2.setName("数学");
            
            Student2 student1=new Student2();
            student1.setName("张三");
            student1.getCourses().add(course1);
            student1.getCourses().add(course2);
            
            Student2 student2=new Student2();
            student2.setName("李四");
            student2.getCourses().add(course1);
            student2.getCourses().add(course2);
            
            session.save(student1);
            session.save(student2);
        }
        
        /**
         * 获取选修 语文 这门课的学生
         */
        @Test
        public void testLoad2(){
            Course2 course = (Course2) session.get(Course2.class, 1);
            Iterator<Student2> students = course.getStudents().iterator();
            while(students.hasNext()){
                Student2 s = students.next();
                System.out.println(s.getName());
            }
        }
    View Code

    查看生成的表结构:

    表的结构、插入后的数据,都和单向关系中创建的一模一样;

    区别就是,现在可以从课程获取到选修这门课程的学生了。

  • 相关阅读:
    搞明白这八个问题,Linux系统就好学多了
    Fedora 25 Alpha版本今天发布啦
    Linux新手应掌握的10个基本命令
    PC-BSD 换名 TrueOS
    JPA+Springboot实现分页效果
    陈亮
    押尾光太郎
    岸部真明
    面试必备-网络的七层协议
    JavaScript中的快速排序
  • 原文地址:https://www.cnblogs.com/tenWood/p/7257538.html
Copyright © 2011-2022 走看看