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();
    }
  • 相关阅读:
    Access sql语句创建表及字段类型
    30条HTML代码编写指南 for入门者
    21 个HTML网页转RSS Feeds的工具
    51 个漂亮的电子商务网站设计分享
    如何更改列表项前的New标记的天数设置(daystoshownewicon )
    如何使Layouts里的页面应用站点母板页
    SPCAMLEditor使用系列(2)利用SPCAMLEditor,实现列表顺序号。
    在SharePoint中使用自定义的服务器控件(Web Control)
    开发支持三级目录的导航菜单
    CAML查询时用户类型字段的处理
  • 原文地址:https://www.cnblogs.com/miller-zou/p/5730582.html
Copyright © 2011-2022 走看看