7.6--SSH学习之关联映射

昨天已在此写过代码的反向生成
可以参照: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

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    ssy03092919

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值