zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    据说,能找出15个以上的的视力才正常....
    看看用PS来转基因的动物,居然很欢乐!!
    《天引》读书笔记——由新月形面积引发的人类长达2000年的探索。
    练习使用策略模式
    折半查找
    UltraEdit常用配置&搭建Java/C开发环境
    一个操作系统的实现_十分钟完成的操作系统——到这里博客迁移工作圆满结束
    C++中的变量初始化
    LeetCode Range Sum Query
    Peeking Iterator
  • 原文地址:https://www.cnblogs.com/snowwang/p/6125636.html
Copyright © 2011-2022 走看看