• hibernate学习(5)——多对多关系映射


    1、创建实体和映射

    package com.alice.hibernate03.vo;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Student {
        private Integer id;
        private String sname;
        private Set<Course> courses = new HashSet<Course>();
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public Set<Course> getCourses() {
            return courses;
        }
        public void setCourses(Set<Course> courses) {
            this.courses = courses;
        }
    }
    package com.alice.hibernate03.vo;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Course {
        private Integer id;
        private String cname;
        private Set<Student> students = new HashSet<Student>();
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getCname() {
            return cname;
        }
        public void setCname(String cname) {
            this.cname = cname;
        }
        public Set<Student> getStudents() {
            return students;
        }
        public void setStudents(Set<Student> students) {
            this.students = students;
        } 
    }

    2、映射

    <?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 package="com.alice.hibernate03.vo">
         <class name="Student" table="t_student">
            <id name="id" column="id">
               <generator class="native"></generator>
            </id>
            <property name="sname" column="sname" type="string"></property>
            <!-- 多对多关系 -->
            <!-- 
                set 表达集合
                    name: 集合的属性名
                    table:多对多中间表的表名
                key 表达外键
                    column:引用我的外键名
                many-to-many 表达多对多
                    class : 集合引用方的类型
                    column:对方在中间表的外键名
             -->
            <set name="courses" table="t_student_course" inverse="false" cascade="save-update">
            <!--
                     key 用来描述外键
                     column : 外键的值
                   -->
              <key column="sid"></key>
              <many-to-many class="Course" column="cid"></many-to-many>
            </set>
         </class>
    </hibernate-mapping>
    <?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 package="com.alice.hibernate03.vo">
         <class name="Course" table="t_course">
            <id name="id" column="id">
               <generator class="native"></generator>
            </id>
            <property name="cname" column="cname" type="string"></property>
            <!-- 多对多关系 -->
    		<!-- 
    			set 表达集合
    				name: 集合的属性名
    				table:多对多中间表的表名
    			key 表达外键
    				column:引用我的外键名
    			many-to-many 表达多对多
    				class : 集合引用方的类型
    				column:对方在中间表的外键名
    		 -->
            <set name="students" table="t_student_course" inverse="true" cascade="save-update">
              <key column="cid"></key>
              <many-to-many class="Student" column="sid"></many-to-many>
            </set>
         </class>
    </hibernate-mapping>
    

      3、测试

    package com.alice.hibernate03.many;
    
    
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.alice.hibernate03.util.HibernateUtil;
    import com.alice.hibernate03.vo.Course;
    import com.alice.hibernate03.vo.Student;
    
    public class ManyTest {
        @Test
        public void test01(){
            //保存学生 => 通过学生保存课程. 由学生维护外键
            //Student 的
                //inverse =  false
                //cascade =  save-update
            //Course
                //inverse = true
            Session session = HibernateUtil.openSession();
            Transaction tran = session.beginTransaction();
            //...........................
            Student s1 = new Student();
            s1.setSname("angle");
            
            Student s2 = new Student();
            s2.setSname("echo");
            
            Course c1 = new Course();
            c1.setCname("jdbc");
            
            Course c2 = new Course();
            c2.setCname("spring");
            
            Course c3 = new Course();
            c3.setCname("strust2");
            
            s1.getCourses().add(c1);
            s1.getCourses().add(c2);
            
            s2.getCourses().add(c2);
            s2.getCourses().add(c3);
            
            session.save(s1);
            session.save(s2);
            //...........................
            tran.commit();
            session.close();
        }
    }
  • 相关阅读:
    Java 数组算法列题解析
    Java数组总结
    go实现汉诺塔
    go实现归并排序
    css清除浮动深度解析
    jquery阻止事件冒泡
    java
    getComputedStyle/currentStyle/style之间的爱恨情仇
    js基础总结
    元素堆叠问题、z-index、position
  • 原文地址:https://www.cnblogs.com/snowwang/p/6125636.html
Copyright © 2020-2023  润新知