天天看點

Hibernate-ORM:12.Hibernate中的多對多關聯關系------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------本篇部落格将講述Hibernate中的多對多關聯關系的操作,準備的篇幅較少,望海涵一,講述多對多二,實體類的建立三,hbm.xml檔案的建立四,hibernate.cfg.xml中管理上方倆個hbm.xml小配置檔案五,單測方法:六,總結:

------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------

本篇部落格将講述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.将一個學生關聯的所有教師都幹掉

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