Hibernate-ORM框架關(guān)系映射

一.單向一對(duì)多的關(guān)聯(lián)

通過在 方使用<set>元素標(biāo)識(shí) 的對(duì)象;
班級(jí)對(duì)象代表一, 學(xué)生對(duì)象代表多
數(shù)據(jù)結(jié)構(gòu)中班級(jí)表學(xué)生表student2.gid 配置外鍵, 關(guān)聯(lián)班級(jí)表主鍵grade.gid
點(diǎn)擊查看練習(xí)代碼

  • 班級(jí)Grade實(shí)體類將學(xué)生屬性設(shè)置為set集合
    //在班級(jí)(一方)定義學(xué)生(多方)的集合
    private Set<Student2> student2 = new HashSet<Student2>();
  • 班級(jí)的hibernate映射文件Grade.hbm.xml的配置
        <!-- 配置單向的一對(duì)多關(guān)聯(lián)關(guān)系 -->
        <set name="student2" table="student2" inverse="false" lazy="true">
            <!-- 指定關(guān)聯(lián)的外鍵列 -->
            <key>
                <column name="gid" />
            </key>
            <!-- 指定一對(duì)多中的Student2實(shí)體類 -->
            <one-to-many class="entity.Student2" />
        </set>
  • set的屬性說明:


    Paste_Image.png

二.單向多對(duì)一的關(guān)聯(lián)

  • 多對(duì)一的關(guān)聯(lián)和關(guān)系型數(shù)據(jù)庫的外鍵參照關(guān)系匹配,
  • 在已有表中的一個(gè)外鍵參照另一個(gè)表的主鍵(比如學(xué)生表添加外鍵關(guān)聯(lián)班級(jí)表主鍵)
  • 通過在多方持有一方的引用實(shí)現(xiàn)
public class Student2 implements Serializable {
    private int sid;
    private String sname;
    private String sex;
    // 在多方定義一個(gè)一方的引用, 該學(xué)生所屬的班級(jí)
    private Grade grade;
} 
  • 需要在"多"的一端使用<many-to-one>配置
    Student2.hbm.xml配置
        <!-- 配置多對(duì)一的關(guān)聯(lián)關(guān)系 -->
        <many-to-one name="grade" class="entity.Grade" column="gid" ></many-to-one>
  • 新增班級(jí)和學(xué)生( 學(xué)生-->班級(jí) 多對(duì)一 )單向關(guān)聯(lián)關(guān)系
    /**
     * 新增班級(jí)和學(xué)生( 學(xué)生-->班級(jí) 多對(duì)一 )單向關(guān)聯(lián)關(guān)系
     */
    public static void add()
    {
        //實(shí)例班級(jí)以及學(xué)生對(duì)象
        Grade grade = new Grade("JAVA-1班", "java1班都是精英");
        Student2 st1 = new Student2("張三1", "男");
        Student2 st2 = new Student2("李四1", "女");        
        //設(shè)置多對(duì)一關(guān)聯(lián)關(guān)系
        st1.setGrade(grade); //學(xué)生張三1屬于JAVA-1班
        st2.setGrade(grade);//學(xué)生李四1屬于JAVA-1班
        //保存數(shù)據(jù)庫
        Transaction tx = session.beginTransaction();
        session.save(grade);
        session.save(st1);
        session.save(st2);
        tx.commit();
        HibernateUtil.closeSession();
    }

調(diào)用后會(huì)輸出:

Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student2
Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into student2 (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into student2 (sname, sex, gid, sid) values (?, ?, ?, ?)
  • 新增班級(jí)和學(xué)生( 班級(jí)-->學(xué)生一對(duì)多查剖,學(xué)生-->班級(jí)多對(duì)一 )雙向關(guān)聯(lián)關(guān)系
    /**
     * 新增班級(jí)和學(xué)生( 班級(jí)-->學(xué)生一對(duì)多射窒,學(xué)生-->班級(jí)多對(duì)一 )雙向關(guān)聯(lián)關(guān)系
     */
    public static void add2()
    {
        //實(shí)例班級(jí)以及學(xué)生對(duì)象
        Grade grade = new Grade("JAVA-1班", "java1班都是精英");
        Student2 st1 = new Student2("張三1", "男");
        Student2 st2 = new Student2("李四1", "女");   
        //設(shè)置關(guān)聯(lián)關(guān)系一對(duì)多
        grade.getStudent2().add(st1);
        grade.getStudent2().add(st2);
        //設(shè)置多對(duì)一關(guān)聯(lián)關(guān)系
        st1.setGrade(grade); //學(xué)生張三1屬于JAVA-1班
        st2.setGrade(grade);//學(xué)生李四1屬于JAVA-1班
        //保存數(shù)據(jù)庫
        Transaction tx = session.beginTransaction();
        session.save(grade);
        session.save(st1);
        session.save(st2);
        tx.commit();
        HibernateUtil.closeSession();
    }

執(zhí)行后輸出:

Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student2
Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into student2 (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into student2 (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: update student2 set gid=? where sid=?
Hibernate: update student2 set gid=? where sid=?

以上結(jié)果多了下面的執(zhí)行語句,是多余的蕊温,因?yàn)槲覀兪请p向關(guān)聯(lián)關(guān)系扒磁,也就是說學(xué)生已經(jīng)知道自己屬于哪個(gè)班級(jí)庆揪,班級(jí)也已經(jīng)知道自已擁有哪些學(xué)生

Hibernate: update student2 set gid=? where sid=?
Hibernate: update student2 set gid=? where sid=?

所以需要在一方Grade.hbm.xml中進(jìn)行配置, set屬性 inverse=ture, 設(shè)置后就不會(huì)出現(xiàn)上面多余的兩行執(zhí)行語句

        <!-- 配置單向的一對(duì)多關(guān)聯(lián)關(guān)系, inverse=ture代表由多方維護(hù)關(guān)聯(lián)關(guān)系,一方不需要進(jìn)行維護(hù) -->
        <set name="student2" table="student2"  inverse="false" lazy="true">
  • cascade級(jí)聯(lián)屬性在保存班級(jí)信息時(shí)妨托,如果已經(jīng)對(duì)班級(jí)設(shè)置了班級(jí)屬性學(xué)生集合set缸榛,那么在執(zhí)行session.save(grade)保存班級(jí)的時(shí)候,系統(tǒng)會(huì)自動(dòng)判斷數(shù)據(jù)庫有無改該班級(jí)所擁有的學(xué)生兰伤,如果沒有則自動(dòng)insert學(xué)生内颗;
    當(dāng)然保存學(xué)生信息session.save(student)時(shí)同理;
  • 保存一方級(jí)聯(lián)關(guān)聯(lián)對(duì)象配置Grade.hbm.xml
        <!-- 配置單向的一對(duì)多關(guān)聯(lián)關(guān)系, inverse=ture代表由多方維護(hù)關(guān)聯(lián)關(guān)系敦腔,一方不需要進(jìn)行維護(hù) 
              cascade="save-update"代表當(dāng)進(jìn)行保存和更新時(shí)均澳,級(jí)聯(lián)操作所關(guān)聯(lián)的對(duì)象-->
        <set name="student2" table="student2"  inverse="true" lazy="true" cascade="save-update">
  • 保存多方級(jí)聯(lián)關(guān)聯(lián)對(duì)象配置Student2.hbm.xml
        <!-- 配置多對(duì)一的關(guān)聯(lián)關(guān)系 cascade="save-update"代表當(dāng)進(jìn)行保存和更新時(shí),級(jí)聯(lián)操作所關(guān)聯(lián)的對(duì)象 -->
        <many-to-one name="grade" class="entity.Grade" column="gid"  cascade="save-update"></many-to-one>
  • casecade屬性說明:


    Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末符衔,一起剝皮案震驚了整個(gè)濱河市找前,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌判族,老刑警劉巖躺盛,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異形帮,居然都是意外死亡槽惫,警方通過查閱死者的電腦和手機(jī)周叮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躯枢,“玉大人则吟,你說我怎么就攤上這事槐臀〕澹” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵水慨,是天一觀的道長(zhǎng)得糜。 經(jīng)常有香客問我,道長(zhǎng)晰洒,這世上最難降的妖魔是什么朝抖? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谍珊,結(jié)果婚禮上治宣,老公的妹妹穿的比我還像新娘。我一直安慰自己砌滞,他們只是感情好侮邀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贝润,像睡著了一般绊茧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上打掘,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天华畏,我揣著相機(jī)與錄音,去河邊找鬼尊蚁。 笑死亡笑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的横朋。 我是一名探鬼主播仑乌,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼叶撒!你這毒婦竟也來了绝骚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤祠够,失蹤者是張志新(化名)和其女友劉穎压汪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體古瓤,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡止剖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年腺阳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穿香。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亭引,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皮获,到底是詐尸還是另有隱情焙蚓,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布洒宝,位于F島的核電站购公,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雁歌。R本人自食惡果不足惜宏浩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靠瞎。 院中可真熱鬧比庄,春花似錦、人聲如沸乏盐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丑勤。三九已至华嘹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間法竞,已是汗流浹背耙厚。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岔霸,地道東北人薛躬。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像呆细,于是被迫代替她去往敵國(guó)和親型宝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容