迷失北京

          BlogJava 聯(lián)系 聚合 管理
            60 Posts :: 0 Stories :: 13 Comments :: 0 Trackbacks

               又從頭學習了一遍hibernate的映射關(guān)系,每一次都會有新的收獲,總是感覺自己還是不會hibernate。單從配置上說:知其然不知其所以然,馬上就要找工作的人了,很是為自己擔心呀!!

               眾所周知,hibernate是一個杰出的O/R MappingObject-Relationl Mapping)框架,單從英文字面意思來解釋:對象關(guān)系映射。在面向?qū)ο缶幊痰倪^程中,我們往往先抽象出系統(tǒng)中涉及的實體對象,然后根據(jù)對象建立數(shù)據(jù)表,無疑后面對于數(shù)據(jù)庫的操作是面向過程的。面向?qū)ο笫呛啙嵉?,面向過程(操作數(shù)據(jù)庫,寫sql語句)是復(fù)雜的。Hibernate恰恰屏蔽了數(shù)據(jù)庫操作這層,用戶只需用面向?qū)ο蟮闹庇^意識來操作數(shù)據(jù)庫這更像一個facade模式,提供了對外的接口,用戶只需調(diào)用接口無需知道具體實現(xiàn)。比如說我想獲得某部門所有成員的信息,用hibernate操作一句話就搞定了session.load(Department.class, n),他的成本僅僅是從數(shù)據(jù)庫load出所需的部門對象。這種方式操作數(shù)據(jù)庫才是面向?qū)ο蟮姆绞剑?/span>現(xiàn)實世界中也是這樣,我想獲取這個部門的所有成員,只需要知道這個部門的詳細信息,因為他的成員肯定包括在詳細信息中。

               但是關(guān)聯(lián)關(guān)系的作用是什么呢?關(guān)聯(lián)關(guān)系就是hibernate處理對象之間所參照的準則。如果你掌握好了這種規(guī)則那么hibernate會更高效的為你工作。舉一個例子:

               假設(shè)我們實現(xiàn)一個從ParentChildren的映射:

          <set name="children">
               <key column="pid">
               <one-to-many class="Child">
          </set>
          

            當我們試圖保存一個Child對象時:

          Parent p = session.load(Parent.class, n);
          Child c = new Child();
          c...
          session.save(c);
          p.getChildren().add(c);
          ...

          這樣我們會得到兩條sql語句一條是保存child的語句,另一條是為兩者建立關(guān)系的sql語句,相當于hibernate執(zhí)行了兩次數(shù)據(jù)庫。

          讓我們看一個更好的方案:

          我們在child方添加配置:

          <many-to-one column="parent" nou-null="rue" column="pid" />

          修改parent的配置,添加inverse="true"屬性,他的意思是將關(guān)聯(lián)關(guān)系交給對方管理,在這就是交給了child一方管理。

          下面我們再來保存一個child實例:

          p.getChildren().add(c);
          c.setParent(p);
          session.save(c);

          這樣只會生成一條insert語句,至于建立兩者之間關(guān)系的那條sql語句在child保存的同時已經(jīng)由hibernate自動更新了,不要忘了維護child-parent之間關(guān)系的責任已經(jīng)交給child一端了。相比上面的方式,我們可以發(fā)現(xiàn)hibernate減少了一次操作數(shù)據(jù)庫的工作,這樣的話相當于你的程序提高了一倍的工作效率,當然只是片面的從操作數(shù)據(jù)庫數(shù)量上來說。

             單向關(guān)聯(lián)關(guān)系有如下幾種:具體還分為有無連接表的。雙向關(guān)聯(lián)關(guān)系亦有有無連接表之分。下面我們來看一下如何配置關(guān)聯(lián)關(guān)系。

          下面這幾種是單向關(guān)聯(lián)無連接表的:                                

          下面這幾種是單向關(guān)聯(lián)基于連接表的:

          下面這幾種是雙向關(guān)聯(lián)無連接表的:

           

          下面這幾種是雙向關(guān)聯(lián)基于連接表的:







          posted on 2011-07-23 19:20 王康 閱讀(146) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 甘谷县| 葫芦岛市| 田林县| 勃利县| 山西省| 兴文县| 凤城市| 怀集县| 合阳县| 白水县| 南郑县| 千阳县| 井陉县| 永春县| 澄迈县| 望江县| 寻乌县| 肇东市| 和政县| 红安县| 进贤县| 藁城市| 云阳县| 长宁区| 蓬安县| 葫芦岛市| 太仆寺旗| 修文县| 杭锦后旗| 柘城县| 清水河县| 阳东县| 仁布县| 依兰县| 大埔县| 边坝县| 子洲县| 尖扎县| 波密县| 黎平县| 连平县|