posts - 7,  comments - 8,  trackbacks - 0
          近來(lái)使用hbernate越多,越覺(jué)得他的關(guān)系映射不簡(jiǎn)單。
          如果用錯(cuò)映射策略,很可能導(dǎo)致表設(shè)計(jì)的修改。
          下面我們分析一下他的多對(duì)多關(guān)系,
          其唯一的用途就是維護(hù)關(guān)系數(shù)據(jù)庫(kù)中兩張表或者多張表之間的關(guān)系
          如最典型的權(quán)限設(shè)計(jì)時(shí),基于組-角色-用戶的設(shè)計(jì),
          三者之間分別為多對(duì)多的關(guān)系,換言之,組可以有多個(gè)角色,角色也可以屬于多個(gè)組。

          group:
          properties:id,name,description,roleSet,userSet

          role
          properties:id,name,description,groupset

          多對(duì)多關(guān)系需要一個(gè)中間表來(lái)維護(hù)(group_role)
          group.hbm.xml
          ?1<hibernate-mapping>
          ?2????<class?name="model.GroupInfo"?table="GROUP_INFO"?lazy="false">
          ?3????????<id?name="id"?type="long"?column="ID">
          ?4????????????<generator?class="native"/>
          ?5????????</id>
          ?6????????<property?name="name"?column="name"?length="20"?type="string"/>
          ?7????????<property?name="description"?column="description"?type="string"/>
          ?8????????<set?name="userSet"?table="group_user"?cascade="save-update"?lazy="true">
          ?9????????????<key?column="group_id"/>
          10????????????<many-to-many?column="user_id"?class="com.essp.fable.model.UserInfo"/>
          11????????</set>
          12????????<set?name="roleSet"?table="group_role"?cascade="save-update"?lazy="true">
          13????????????<key?column="group_id"/>
          14????????????<many-to-many?column="role_id"?class="com.essp.fable.model.RoleInfo"/>
          15????????</set>
          16????</class>
          17</hibernate-mapping>
          role.hbm.xml
          ?1<hibernate-mapping>
          ?2????<class?name="model.RoleInfo"?table="ROLE_INFO"?lazy="false">
          ?3????????<id?name="id"?type="long"?column="ID">
          ?4????????????<generator?class="native"/>
          ?5????????</id>
          ?6????????<property?name="name"?column="name"?length="20"?type="string"/>
          ?7????????<set?name="groupSet"?table="group_role"?cascade="save-update"?inverse="true"?lazy="true">
          ?8????????????<key?column="role_id"/>
          ?9????????????<many-to-many?column="group_id"?class="com.essp.fable.model.GroupInfo"/>
          10????????</set>
          11????</class>
          12</hibernate-mapping>

          我們大都以set集合來(lái)實(shí)現(xiàn)他們的映射關(guān)系,配置xml的時(shí)候,最重的幾個(gè)屬性就是cascadeinverse
          cascade翻譯為 小瀑布, 噴流,在這里表示對(duì)象間的級(jí)聯(lián)關(guān)系,可以分別取值 為all,none,save-update,delete,all-delete-orphan,delete-orphan

          cascade屬性并不是多對(duì)多關(guān)系一定要用的,有了它只是讓我們?cè)诓迦牖騽h除對(duì)像時(shí)更方便一些,只要在cascade的源頭上插入或是刪除,所有cascade的關(guān)系就會(huì)被自己動(dòng)的插入或是刪除。
          為了能正確的cascade,unsaved-value是個(gè)很重要的屬性。Hibernate通過(guò)這個(gè)屬性來(lái)判斷一個(gè)對(duì)象應(yīng)該save還是update,如果這個(gè)對(duì)象的id是unsaved-value的話,那說(shuō)明這個(gè)對(duì)象不是persistence object要save(insert);如果id是非unsaved-value的話,那說(shuō)明這個(gè)對(duì)象是persistence object(數(shù)據(jù)庫(kù)中已存在),只要update就行了。saveOrUpdate方法用的也是這個(gè)機(jī)制。
          如unsaved-value="0",那當(dāng)該值為0時(shí),hibernate即判斷其為未存儲(chǔ)的對(duì)像,當(dāng)執(zhí)行saveOrUpdate時(shí),實(shí)際執(zhí)行的是save了。
          In Hibernate3, it is no longer necessary to specify an unsaved-value explicitly. 不過(guò)在hibernate3中我們不需要顯示的去指定他,hiberante會(huì)自動(dòng)差別出該對(duì)像是否是新產(chǎn)生的對(duì)象。

          inverse翻譯為 倒轉(zhuǎn)的, 反轉(zhuǎn)的。他屬于關(guān)系和對(duì)象的級(jí)聯(lián)關(guān)系,默認(rèn)時(shí)為false,,就是說(shuō)關(guān)系的兩端都來(lái)維護(hù)關(guān)系.如果一邊設(shè)為true,那表示他們之間的關(guān)系由對(duì)方來(lái)維護(hù)。
          比如上面的例子,我們?cè)O(shè)role的inverse為true,即他們的關(guān)系有g(shù)roup來(lái)維護(hù)。
          GroupInfo group = new GroupInfo();
          group.setName("admin");
          RoleInfo role = new RoleInfo();
          role.setName("acl");
          group.addRole(role);
          save(group);
          執(zhí)行完這些操作后,hibernate會(huì)自動(dòng)保存group,role,若反之,則只會(huì)保存role.
          posted on 2006-06-08 17:24 鹽巴 閱讀(2216) 評(píng)論(1)  編輯  收藏 所屬分類: JAVA

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 广宁县| 老河口市| 黄浦区| 宣城市| 东方市| 昂仁县| 宣汉县| 那坡县| 遂川县| 常州市| 剑阁县| 海城市| 兰州市| 武义县| 观塘区| 英吉沙县| 宜都市| 德昌县| 抚远县| 曲水县| 辽中县| 浦城县| 富民县| 建昌县| 无锡市| 新丰县| 织金县| 桃园县| 重庆市| 曲水县| 左权县| 根河市| 广东省| 岳西县| 张家港市| 苍山县| 东台市| 溧水县| 玛曲县| 贺兰县| 怀柔区|