zoukankan      html  css  js  c++  java
  • Hibernate-ORM:12.Hibernate中的多对多关联关系

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

    本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵

    一,讲述多对多

      多对多的关联关系,比如学生和教师来说,一个学生由多个教师授课,一个教师授课给多个学生,这就是多对多

      讲述多对多,首先要有一个表叫做中间表,他来承载关联关系

    二,实体类的创建

      1.Stu学生类创建:

    package cn.dawn.day04.entity;
    
    /**
     * Created by Dawn on 2018/6/2.
     */
    import java.io.Serializable;
    import java.util.Set;
    
    /*学生实体类*/
    public class Stu implements Serializable{
        private Long sid;
        private String sname;
        /*教师对象集合*/
        private Set<Tea> teas;
        public Long getSid() {
            return sid;
        }
    
        public void setSid(Long sid) {
            this.sid = sid;
        }
    
        public String getSname() {
            return sname;
        }
    
        public void setSname(String sname) {
            this.sname = sname;
        }
    
        public Set<Tea> getTeas() {
            return teas;
        }
    
        public void setTeas(Set<Tea> teas) {
            this.teas = teas;
        }
    }

      2.Tea教室类的创建:

    package cn.dawn.day04.entity;
    
    import java.io.Serializable;
    import java.util.Set;
    
    /**
     * Created by Dawn on 2018/6/2.
     */
    /*教师实体类*/
    public class Tea implements Serializable {
        private Long tid;
        private String tname;
        /*学生对象集合*/
        private Set<Stu> stus;
    
        public Long getTid() {
            return tid;
        }
    
        public void setTid(Long tid) {
            this.tid = tid;
        }
    
        public String getTname() {
            return tname;
        }
    
        public void setTname(String tname) {
            this.tname = tname;
        }
    
        public Set<Stu> getStus() {
            return stus;
        }
    
        public void setStus(Set<Stu> stus) {
            this.stus = stus;
        }
    }

    三,hbm.xml文件的创建

      1.Stu.hbm.xml

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="cn.dawn.day04.entity">
        <!--如果上面指定package的话,class的name就不必写全类名-->
        <!--lazy:是否懒加载(延迟加载)        默认值是true,延迟加载-->
        <!--<class name="Teacher">-->
        <!--直接加载-->
        <class name="Stu" lazy="false">
            <!--主键-->
            <id name="sid" column="sid">
                <!--主键生成策咯  assigned程序员自己创建-->
                <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值-->
                <!--increment是先查最大的主键列,在下一条给主键加一-->
                <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>-->
                <generator class="increment"></generator>
            </id>
            <property name="sname" column="tname"></property>
            <!--table指的是中间表,承载关联关系的表-->
            <set name="teas" table="tea_stu" cascade="save-update" inverse="false">
                <key>
                    <!--本类表的id-->
                    <column name="sid"></column>
                </key>
                <!--另外与他有多对多关联的实体类-->
                <many-to-many class="Tea" column="tid"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>

      2.Tea.hbm.xml文件的创建:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="cn.dawn.day04.entity">
        <!--如果上面指定package的话,class的name就不必写全类名-->
        <!--lazy:是否懒加载(延迟加载)        默认值是true,延迟加载-->
        <!--<class name="Teacher">-->
        <!--直接加载-->
        <class name="Tea" lazy="false">
            <!--主键-->
            <id name="tid" column="tid">
                <!--主键生成策咯  assigned程序员自己创建-->
                <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值-->
                <!--increment是先查最大的主键列,在下一条给主键加一-->
                <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>-->
                <generator class="increment"></generator>
            </id>
            <property name="tname" column="tname"></property>
            <!--table指的是中间表,承载关联关系的表-->
            <set name="stus" table="tea_stu" cascade="save-update" inverse="false">
                <key>
                    <!--本类表的id-->
                    <column name="tid"></column>
                </key>
                <!--另外与他有多对多关联的实体类-->
                <many-to-many class="Stu" column="sid"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>

    四,hibernate.cfg.xml中管理上方俩个hbm.xml小配置文件

            <!--与小配置文件映射-->
            <mapping resource="cn/dawn/day04/dao/Tea.hbm.xml"></mapping>
            <mapping resource="cn/dawn/day04/dao/Stu.hbm.xml"></mapping>

    五,单测方法:

        @Test
        /*同时保存,并建立关联关系*/
        public void t1ManyToManyInsert(){
            /*
             * 新建一个教师
             */
            Tea tea1=new Tea();
            tea1.setTname("老雨");
            /**
             * 新建俩个学生
             */
            Stu stu1=new Stu();
            stu1.setSname("小六");
            Stu stu2=new Stu();
            stu2.setSname("小八");
    
            Set<Stu> students = new HashSet<Stu>();
            students.add(stu1);
            students.add(stu2);
            /**
             * 通过课程建立课程与学生之间的关系
             */
            tea1.setStus(students);//因为课程是一个新的,所以根据没有学生
            /*新增*/
            session.save(tea1);
            /*事务提交*/
            tr.commit();
    
    
    
            /*
            Hibernate: create table Stu (sid bigint not null, tname varchar(255), primary key (sid)) engine=MyISAM
            Hibernate: create table Tea (tid bigint not null, tname varchar(255), primary key (tid)) engine=MyISAM
            Hibernate: create table tea_stu (tid bigint not null, sid bigint not null, primary key (sid, tid)) engine=MyISAM
            Hibernate: alter table tea_stu add constraint FK1lo22k662lgxr7d79rmfajlu3 foreign key (sid) references Stu (sid)
            Hibernate: alter table tea_stu add constraint FKgq01y04i2r2ye5pd8abh5x42u foreign key (tid) references Tea (tid)
            Hibernate: select max(tid) from Tea
            Hibernate: select max(sid) from Stu
            Hibernate: insert into Tea (tname, tid) values (?, ?)
            Hibernate: insert into Stu (tname, sid) values (?, ?)
            Hibernate: insert into Stu (tname, sid) values (?, ?)
            Hibernate: insert into tea_stu (tid, sid) values (?, ?)
            Hibernate: insert into tea_stu (tid, sid) values (?, ?)
            * */
        }

    六,总结:

      我认为此处写的已经足够,最好的学习方法就是尝试,自己来试一下

      我可以提出需求:

        1.保存单个学生

        2.修改一个教师下关联的学生

        3.将一个学生关联的所有教师都干掉

        等等等。。。。。。。。。。。。。

  • 相关阅读:
    Entity Framework 简介
    MongoDB 简述及安装
    js、sql和python版本的乘法口诀对比
    sql 判断输入的日期是否有重叠
    win10 不能调节屏幕亮度 win10 屏幕亮度调节快捷键不能用
    mysql主从配置常见错误处理
    Linux安装mysql总结
    linux安装mongodb总结
    centos安装redis总结
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
  • 原文地址:https://www.cnblogs.com/DawnCHENXI/p/9124565.html
Copyright © 2011-2022 走看看