zoukankan      html  css  js  c++  java
  • Hibernate5.2之多对多关联关系(六)

                                                 Hibernate5.2之多对多关联关系(六)

    一.简介

      Hibernate中多对多关联关系在工程中使用的频率也是非常高的,例如:大学中学生选课、用户订单等。在本博客中笔者一样通过实例代码为读者阐述Hibernate中的这种关联关系,笔者所采用的是学生选课的案例。

    二.数据库的创建

    create table courses (
       id number(10,0) not null, 
       cname varchar2(255 char), 
       primary key (id)
    );
    
    create table stu_course (
       student_id number(10,0) not null, 
       course_id number(10,0) not null, 
       primary key (course_id, student_id)
    );
    
    create table students (
       id number(10,0) not null, 
       name varchar2(255 char), 
       primary key (id)
    );

    三.hbm配置文件的方式

    3.1 POJO类的创建

    public class Student {
        private int id;
        private String name;
        private Set<Course> courses;
        
        //setter and getter
    }
    
    public class Course {
        private int id;
        private String name;
        private Set<Student> students;
        
        //setter and getter
    }

    3.2 hbm文件的创建

    Student.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
        <class name="com.demo.hibernate.many2many.Student" table="students">
            <id name="id" type="int" column="id">
                <generator class="increment"></generator>
            </id>
            
            <property name="name" type="string" column="name"></property>
            
            <set name="courses" table="stu_course">
                <key column="student_id"></key>
                <many-to-many class="com.demo.hibernate.many2many.Course" column="course_id"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>

    Course.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
        <class name="com.demo.hibernate.many2many.Course" table="courses">
            <id name="id" type="int" column="id">
                <generator class="increment"></generator>
            </id>
        
            <property name="name" type="string" column="cname"></property>
            
            <set name="students" table="stu_course" inverse="true">
                <key column="course_id"></key>
                <many-to-many class="com.demo.hibernate.many2many.Student" column="student_id"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>

    四.注解的方式

    Student.java

    @Entity
    @Table(name="students")
    public class Student {
        
        @Id
        @Column(name="id")
        @GenericGenerator(name="incrementGenerator", strategy="increment")
        @GeneratedValue(generator="incrementGenerator")
        private int id;
        
        @Column(name="name")
        private String name;
        
        @ManyToMany
        @JoinTable(name="stu_course", 
            joinColumns={@JoinColumn(name="student_id")}, 
            inverseJoinColumns={@JoinColumn(name="course_id")})
        private Set<Course> courses;

    //setter and getter
    }

     Course.java

    @Entity
    @Table(name="courses")
    public class Course {
        
        @Id
        @Column(name="id")
        @GenericGenerator(name="incrementGenerator", strategy="increment")
        @GeneratedValue(generator="incrementGenerator")
        private int id;
        
        @Column(name="cname")
        private String name;
        
        @ManyToMany(mappedBy="courses")
        private Set<Student> students;
        
        //setter and getter
    }

    五.代码测试

    A.保存

    @Test
    public void save(){
        Transaction tx = session.beginTransaction();
            
        Student s1 = new Student();
        s1.setName("BBB");
            
        Course c1 = new Course();
        c1.setName("音乐");
            
        Set<Student> students = new HashSet<Student>();
        Set<Course> courses = new HashSet<Course>();
            
        students.add(s1);
        courses.add(c1);
            
        s1.setCourses(courses);
        c1.setStudents(students);
            
        session.save(s1);
        session.save(c1);
            
        tx.commit();
    }

    B.更新1

    //新开了一门课,然后学生选择了该课程
    @Test
    public void addCourse(){
        Transaction tx = session.beginTransaction();
        Student student = session.get(Student.class, 1);
        Course c1 = new Course();
        c1.setName("音乐");
            
        student.getCourses().add(c1);
        session.saveOrUpdate(c1);
        session.saveOrUpdate(student);
        tx.commit();
    }

    C.更新2

    //新增学生,然后学生选择课程
    @Test
    public void  addStudent(){
        Transaction tx = session.beginTransaction();
        Student s = new Student();
        s.setName("HHH");
            
        Query<Course> query = session.createQuery("from Course where id in :ids", Course.class);
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        query.setParameter("ids", list);
            
        Set<Course> courses = new HashSet<Course>(query.getResultList());
            
        s.setCourses(courses);
        session.save(s);
        tx.commit();
    }

    D.更新3

    //学生改变课程
    @Test
    public void changeCourse(){
        Transaction tx = session.beginTransaction();
        Student student = session.get(Student.class, 1);
            
        Course course = session.get(Course.class, 2);
        Set<Course> courses = new HashSet<Course>();
        courses.add(course);
            
        student.setCourses(courses);
            
        session.update(student);
        tx.commit();
    }

    E.删除

    //删除了学生
    @Test
    public void delete(){
        Transaction tx = session.beginTransaction();
        Student s = new Student();
        s.setId(1);
            
        session.delete(s);
        tx.commit();
    }
  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/miller-zou/p/5730582.html
Copyright © 2011-2022 走看看