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();
    }
  • 相关阅读:
    描述下jvm的gc机制,常用的jvm调优方法,oom如何产生,如何处理oom 问题?
    大数据hadoop 面试经典题
    redis 个人理解和常用命令以及应用场景
    Hadoop 源码编译 step by step 最简洁的步骤
    Openstack 的介绍 ,安装以及简单应用
    Docker 的介绍 ,安装以及简单应用
    星型模型和雪花模型的应用场景
    php向js的函数内传递参数-用经纬度计算2点间的距离
    php-URL方法下载远程图片
    微信开发-js接口的使用无法使用分享功能的一些说明
  • 原文地址:https://www.cnblogs.com/miller-zou/p/5730582.html
Copyright © 2011-2022 走看看