7.6--SSH学习之关联映射

来源:互联网 发布:如何删除mac下载程序 编辑:程序博客网 时间:2024/06/05 00:47

昨天已在此写过代码的反向生成
可以参照:http://blog.csdn.net/su1573/article/details/74509201


今天来记下学习的关联映射:
一对一,一对多,单向多对一,双向多对一,多对多



  • 一对一关联映射

用两张表,一个学生表,一个教师表,关系:一个老师 单独辅导一个学生哦(1000/h)
属性分别为:

    Student.java    private Integer stuId;    private String stuName;    private String stuGender;    private Integer stuAge;    private Teacher teacher;


    Teacher,java    private Integer teacherId;    private String teacherName;    private String teacherPwd;    private Integer teacherLevel;    private Student student;


配置文件分别为:

    Student.hbm.xml    <class name="Student" table="STU_TAB">        <id name="stuId" column="STU_ID">            <generator class="native"/>        </id>        <property name="stuName" column="STU_NAME"/>        <property name="stuGender" column="STU_GENDER"/>         <property name="stuAge" column="STU_AGE"/>    </class>
    Teacher.hbm.xml    <class name="Teacher" table="TEA_TAB">        <id name="teacherId" column="TEA_ID">            <generator class="native"/>        </id>        <property name="teacherName" column="TEA_NAME" not-null="true"/>        <property name="teacherPwd" column="TEA_PWD" not-null="true"/>        <property name="teacherLevel" column="TEA_LEVEL" not-null="true"/>         <many-to-one name="student" class="Student" column="STU_ID"   cascade="save-update"  lazy="false" unique="true"></many-to-one>    </class>



根据配置文件在数据库自动建表需要用到Configuration和SchemaExport代码如下:

    public static void main(String[] args) {        // 默认读取hibernate.cfg.xml文件        Configuration cfg = new Configuration().configure();        // 生成并输出sql到文件(当前目录)和数据库         SchemaExport se = new SchemaExport(cfg);        // 创建表结构,第一个true 表示在控制台打印sql语句,第二个true 表示导入sql语句到数据库        se.create(true, true);    }



测试数据如下:

    public static void main(String[] args) {        // TODO Auto-generated method stub        StudentDao stuDao = new StudentDaoImpl();//      Student stu = new Student();   //增加信息//      stu.setStuName("苏");//      stu.setStuGender("男");//      stu.setStuAge(21);//      //      stuDao.addStudent(stu);//      Student stu = stuDao.findStudentById(2); //通过id查询//      System.out.println(stu.getStuName());        List<Student> list = stuDao.findAllStudent();  //列出全部信息        for(Student stu : list){            System.out.println(stu.getStuName());        }    }




  • 一对多映射

  • 用两张表,一张学生表,一张班级表,关系:一个班级可以有多个学生

    属性如下:

        Student.java    private Integer stuId;    private String stuName;    private String stuGender;    private Integer stuAge;    private Integer clasesId;


        Classes.java    private Integer classesId;    private String classesName;    private Set<Student> stuSet = new HashSet<Student>();


    配置文件分别为:

       Student.hbm.xml    <class name="Student" table="STU_TAB">        <id name="stuId" column="STU_ID">            <generator class="native"/>        </id>        <property name="stuName" column="STU_NAME"/>        <property name="stuGender" column="STU_GENDER"/>         <property name="stuAge" column="STU_AGE"/>          <property name="classesId" column="CLA_ID"/>    </class>


        Classes.hbm.xml    <class name="Classes" table="CLA_TAB">        <id name="classesId" column="CLA_ID">            <generator class="native"/>        </id>        <property name="classesName" column="CLA_NAME"/>        <set name="stuSet" cascade="save-update">            <key column="CLA_ID"></key>            <one-to-many class="Student"/>        </set>    </class>



  • 单向多对一映射

  • 用两张表,一个学生表,一个班级表,关系:多个学生在同一班级
    属性分别为:

        Student.java    private Integer stuId;    private String stuName;    private String stuGender;    private Integer stuAge;    private Classes classes;


        Classes.java    private Integer classesId;    private String classesName;


    配置文件分别为:

        Student.hbm.xml    <class name="Student" table="STU_TAB">        <id name="stuId" column="STU_ID">            <generator class="native"/>        </id>        <property name="stuName" column="STU_NAME"/>        <property name="stuGender" column="STU_GENDER"/>         <property name="stuAge" column="STU_AGE"/>         <many-to-one name="classes" class="Classes" column="CLA_ID" cascade="save-update" lazy="false"></many-to-one>    </class>


    <class name="Classes" table="CLA_TAB">        <id name="classesId" column="CLA_ID">            <generator class="native"/>        </id>        <property name="classesName" column="CLA_NAME"/>    </class>


    测试数据如下:

        public static void main(String[] args) {        // TODO Auto-generated method stub        try{            //解析配置文件            Configuration cfg = new  Configuration().configure();            //创建SessionFactory对象            SessionFactory sf= cfg.buildSessionFactory(new StandardServiceRegistryBuilder()                                            .applySettings(cfg.getProperties()).build());            //有SessionFactory对象生成Session对象(用Session对象执行数据库表的增删改查)            Session session = sf.openSession();            //事务开始(Hibernate强制所有的数据库操作都必须在事务中进行,所以开启事务才能执行相关操作)            session.beginTransaction();            StudentDao std = new StudentDaoImpl();            Classes cs = new Classes();            cs.setClassesName("武术班");            Classes cs1 = new Classes();            cs1.setClassesName("绘画班");            Student stu = new Student();            stu.setStuName("su");            stu.setStuGender("male");            stu.setStuAge(23);            stu.setClasses(cs);            Student stu1 = new Student();            stu1.setStuName("liu");            stu1.setStuGender("female");            stu1.setStuAge(20);            stu1.setClasses(cs1);            Student stu2 = new Student();            stu2.setStuName("he");            stu2.setStuGender("male");            stu2.setStuAge(24);            stu2.setClasses(cs);            std.addEntity(stu);            std.addEntity(stu1);            std.addEntity(stu2);            session.getTransaction().commit();//事务提交        }catch(Exception e){            e.printStackTrace();        }    }


    数据库中的数据如下图

    这里写图片描述
    这里写图片描述


  • 双向多对一映射

  • 和单向多对一的区别就是在配置文件中,两头都要配置

    用两张表,一个学生表,一个班级表,关系:多个学生在同一班级
    属性分别为:

        Student.java    private Integer stuId;    private String stuName;    private String stuGender;    private Integer stuAge;    private Classes classes;


        Classes.java    private Integer classesId;    private String classesName;


    配置文件分别为:

        Student.hbm.xml    <class name="Student" table="STU_TAB">        <id name="stuId"  column="STU_ID">            <generator class="native"/>        </id>        <property name="stuName" column="STU_NAME" not-null="true"/>        <property name="stuGender" column="STU_GENDER"/>        <property name="stuAge" column="STU_AGE"/>        <many-to-one name="classes" class="Classes" column="CLA_ID" cascade="save-update" lazy="false"></many-to-one>    </class>


       Classes.hbm.xml   <class name="Classes" table="CLA_TAB">        <id name="classesId" column="CLA_ID">            <generator class="native"/>        </id>        <property name="classesName" column="CLA_NAME" not-null="true"/>        <set name="stuSet" cascade="save-update" lazy="false" inverse="true">            <key column="CLA_ID">            </key>            <one-to-many class="Student"/>        </set>    </class>


    测试数据如下:

    public static void main(String[] args) {        // TODO Auto-generated method stub        try{            //解析配置文件            Configuration cfg = new Configuration().configure();            //创建SessionFactory对象            SessionFactory sf = cfg.buildSessionFactory(new StandardServiceRegistryBuilder()                                                .applySettings(cfg.getProperties()).build());            //由SessionFactory对象生成Session对象(用Session对象执行对数据表的增删改查)            Session session = sf.openSession();            //开启Session事物(Hibernate强制所有的数据库操作都必须在事物中进行,所以开启事务才能执行相关操作)            session.beginTransaction();            Student stu = new Student();            stu.setStuName("sanmao");            stu.setStuAge(19);            stu.setStuGender("男");            Student stu1 = new Student();            stu1.setStuName("xiaoqiang");            stu1.setStuAge(20);            stu1.setStuGender("女");            Student stu2 = new Student();            stu2.setStuName("ruhua");            stu2.setStuAge(21);            stu2.setStuGender("女");            Classes classes = new Classes();            classes.setClassesName("跆拳道班");//          stu.setClasses(classes);//          stu1.setClasses(classes);//          stu2.setClasses(classes);//          session.save(stu);//          session.save(stu1);//          session.save(stu2);            classes.getStuSet().add(stu);            classes.getStuSet().add(stu1);            classes.getStuSet().add(stu2);            session.save(classes);            session.getTransaction().commit();            //session.close();        }catch(Exception ex){            ex.printStackTrace();        }    }



  • 多对多映射

  • 在此关联映射中用到了两张表,一个是学生表,一个是教师表。关系,多个生对应多教师
    另外,一般用set集合链接另一端,但还有list集合(不推荐,容易出错),以下代码注释的部分为set集合,当练习时可以把有关list集合的注释,放开set集合的代码

    属性分别为:

        Student.java    private Integer stuId;    private String stuName;    private String stuGender;    private Integer stuAge;//  private Set<Teacher> teaSet = new HashSet<Teacher>();    private List<Teacher> tealist = new ArrayList<Teacher>();


        Teacher.java    private Integer teacherId;    private String teaName;    private String teacherPwd;    private Integer teacherLevel;//  private Set<Student> stuSet = new HashSet<Student>();    private List<Student> stulist = new ArrayList<Student>();


    配置文件分别为:

        Student.hbm.xml    <class name="Student" table="STU_TAB">        <id name="stuId" column="STU_ID">            <generator class="native"/>        </id>        <property name="stuName" column="STU_NAME"/>        <property name="stuGender" column="STU_GENDER"/>         <property name="stuAge" column="STU_AGE"/>         <!--  <set name="teaSet" cascade="save-update" lazy="false" table="STU_TEA_TAB">            <key column="STU_ID"></key>            <many-to-many class="Teacher" column="TEA_ID"></many-to-many>         </set>-->         <list name="tealist" cascade="save-update" lazy="false" table="STU_TEA_TAB">            <key column="STU_ID"></key>            <list-index column="STU_TEA_INDEX"></list-index>            <many-to-many class="Teacher" column="TEA_ID"> </many-to-many>         </list>    </class>


        Teacher.hbm.xml    <class name="Teacher" table="TEA_TAB">        <id name="teacherId" column="TEA_ID">            <generator class="native"/>        </id>        <property name="teaName" column="TEA_NAME" not-null="true"/>        <property name="teacherPwd" column="TEA_PWD" not-null="true"/>        <property name="teacherLevel" column="TEA_LEVEL" not-null="true"/>         <!--  <set name="stuSet" cascade="save-update" lazy="false" table="STU_TEA_TAB" inverse="true">            <key column="TEA_ID"></key>            <many-to-many class="Student" column="STU_ID"></many-to-many>         </set>-->         <list name="stulist" cascade="save-update" table="STU_TEA_TAB" lazy="false" inverse="true">            <key column="TEA_ID"></key>            <list-index column="STU_TEA_INDEX"></list-index>            <many-to-many class="Student" column="STU_ID"></many-to-many>         </list>    </class>


    测试数据如下:

        public static void main(String[] args) {        // TODO Auto-generated method stub        try{            //解析配置文件            Configuration cfg = new  Configuration().configure();            //创建SessionFactory对象            SessionFactory sf= cfg.buildSessionFactory(new StandardServiceRegistryBuilder()                                            .applySettings(cfg.getProperties()).build());            //有SessionFactory对象生成Session对象(用Session对象执行数据库表的增删改查)            Session session = sf.openSession();            //事务开始(Hibernate强制所有的数据库操作都必须在事务中进行,所以开启事务才能执行相关操作)            session.beginTransaction();            Student stu = new Student();            stu.setStuName("小苏");            stu.setStuGender("男");            stu.setStuAge(23);            session.save(stu);            Student stu1 = new Student();            stu1.setStuName("小刘");            stu1.setStuGender("女");            stu1.setStuAge(20);            session.save(stu1);            Student stu2 = new Student();            stu2.setStuName("小张");            stu2.setStuGender("男");            stu2.setStuAge(22);            session.save(stu2);//          //          Teacher teacher = new Teacher();//          teacher.setTeaName("王老师");//          teacher.setTeacherPwd("111");//          teacher.setTeacherLevel(111);//          session.save(teacher);//          Teacher teacher1 = new Teacher();//          teacher1.setTeaName("刘老师");//          teacher1.setTeacherPwd("222");//          teacher1.setTeacherLevel(222);//          session.save(teacher1);//          Teacher teacher2 = new Teacher();//          teacher2.setTeaName("张老师");//          teacher2.setTeacherPwd("333");//          teacher2.setTeacherLevel(333);//          session.save(teacher2);//          //list集合级联增加//          stu.getTealist().add(teacher);//          stu.getTealist().add(teacher1);//          stu.getTealist().add(teacher2);//          //          stu1.getTealist().add(teacher1);//          stu1.getTealist().add(teacher2);//          //          stu2.getTealist().add(teacher);            //先查出学生和老师,再进行增加//          Student stu = (Student)session.get(Student.class, 2);//          System.out.println("学生"+stu.getStuName()+";");//          Teacher tea = (Teacher)session.get(Teacher.class, 4);//          System.out.println("想加入"+tea.getTeaName()+"。");//          stu.getTealist().add(tea);            //set集合级联增加//          stu.getTeaSet().add(teacher);//          stu.getTeaSet().add(teacher1);//          //          stu1.getTeaSet().add(teacher2);//          //          stu2.getTeaSet().add(teacher2);//          stu2.getTeaSet().add(teacher);//          //          session.save(stu);//          session.save(stu1);//          session.save(stu2);            //set通过学生找老师//          Student stu = (Student)session.get(Student.class, 1);//          System.out.println(stu.getStuName());//          Set<Teacher> set = stu.getTeaSet();//          for(Teacher tea: set){//              System.out.println(tea.getTeaName());//          }            //set通过老师找学生//          Teacher tea = (Teacher)session.get(Teacher.class, 4);//          System.out.println(tea.getTeaName());//          Set<Student> set = tea.getStuSet();//          for(Student stu:set){//              System.out.println(stu.getStuName());//          }            //list通过学生找老师//          Student stu = (Student)session.get(Student.class, 1);//          System.out.println(stu.getStuName());//          List<Teacher> list = stu.getTealist();//          for(Teacher teacher:list){//              System.out.println(teacher.getTeaName());//          }            //list通过老师找学生//          Teacher tea = (Teacher)session.get(Teacher.class, 6);//          System.out.println(tea.getTeaName());//          List<Student> list = tea.getStulist();//          System.out.println(list.size());//          for(Student stu:list){//              System.out.println(stu.getStuName());//          }//          Student stu = (Student)session.get(Student.class, 1);//          System.out.println(stu.getStuName());//          //          stu.setStuName("刘慧娟");//          stu.setStuGender("女");//          stu.setStuAge(20);//          session.delete(stu);  //删除            session.getTransaction().commit();//事务提交        }catch(Exception e){            e.printStackTrace();        }    }


    到此Hibernate的关联映射已介绍完


    Author:su1573

    原创粉丝点击