隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊(cè)

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827222
          • 排名 - 49

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          映射中的inverse

            首先要明確一點(diǎn),inverse只存在于集合標(biāo)記的元素中,Hibernate所提供的集合元素包括<set/>,
          <map/>,<list/>,和<bag/>.
            inverse屬性的作用是是否將對(duì)集合的修改反應(yīng)到數(shù)據(jù)庫中.也就是說當(dāng)inverse="false"時(shí),對(duì)
          集合對(duì)象的修改會(huì)被反映到數(shù)據(jù)庫中,而inverse="true"時(shí),則不會(huì)對(duì)數(shù)據(jù)庫進(jìn)行相應(yīng)的處理.
            inverse的默認(rèn)值是等于false.
            inverse所描述的是對(duì)象之間關(guān)聯(lián)關(guān)系的維護(hù)方式.
            換個(gè)角度來理解,inverse屬性的作用也可以理解為設(shè)置對(duì)象之間關(guān)聯(lián)關(guān)系的維護(hù)方在哪一端.當(dāng)
          inverse="false"時(shí),表明對(duì)象之間的關(guān)聯(lián)關(guān)系由本方來進(jìn)行維護(hù).而當(dāng)其inverse="true"時(shí)則表明對(duì)象
          之間的關(guān)聯(lián)關(guān)系由關(guān)聯(lián)的另一方進(jìn)行維護(hù).

          下面以一個(gè)例子說明
          一對(duì)多關(guān)聯(lián)關(guān)系

          用戶實(shí)體(User)和留言實(shí)體(Message)之間的一對(duì)多關(guān)聯(lián)關(guān)系.
          在User.hbm.xml配置文件中
          ...
            <set name="messages" inverse="false" cascade="all" >
                   <key>
                      <column name="user_id" length="32" />
                   </key>
                   <one-to-many class="dgut.ke.blog.model.Message" />
              </set>
          ...
          保存實(shí)體的情況:
          將inverse的值設(shè)為false,控制臺(tái)輸出的語句如下
          (Message對(duì)象自己需要發(fā)出update語句來維護(hù)兩者的關(guān)聯(lián)關(guān)系)
          Hibernate: insert into user (name, password, id) values (?, ?, ?)
          Hibernate: insert into message (title, content, pubdate, user_id, id) values (?, ?, ?, ?, ?)
          Hibernate: update message set user_id=? where id=?
          當(dāng)把inverse的值設(shè)置為true時(shí),則上面的第三條SQL語句則不會(huì)發(fā)出.關(guān)聯(lián)關(guān)系由User進(jìn)行維護(hù).
          刪除子對(duì)象的情況:
          將inverse的值設(shè)為false,控制臺(tái)輸出的語句如下
          Hibernate: update message set user_id=null where user_id=?
          Hibernate: delete from message where id=?
          同樣將inverse的值設(shè)為true,則update語句不會(huì)發(fā)出.

          多對(duì)多的關(guān)聯(lián)關(guān)系

            注:在設(shè)置多對(duì)多關(guān)系的inverse屬性的時(shí)候,不能兩個(gè)對(duì)象都將其設(shè)置為true,否則這兩個(gè)對(duì)象就不能維護(hù)
          兩者之間的關(guān)系了.
          用戶實(shí)體(User)和角色(Role)之間的多對(duì)多關(guān)聯(lián)關(guān)系
          相關(guān)配置文件
          User.hbm.xml
          ...
              <set name="roles" table="user_role" cascade="save-update">
                 <key column="user_id" />
                 <many-to-many class="dgut.ke.blog.model.Role" column="role_id" />
              </set>
          ...
          Role.hbm.xml
          ...
            <set name="users" table="user_role" inverse="true" cascade="save-update">
                 <key column="role_id" />
                 <many-to-many class="dgut.ke.blog.model.User" column="user_id"/>
              </set>
          ...
            注意:在Role.hbm.xml配置文件中設(shè)置inverse="true"屬性,因而User和Role兩者之間的關(guān)系通過
          User來進(jìn)行維護(hù)
          .

          保存實(shí)體情況:
            ...
            User user = (User)session.get(User.class, "2c9ab2d514af5a3d0114af5a41f90001");
            Role role = new Role();
            user.getRoles().add(role);
            session.save(role); 
            ...
          在運(yùn)行的過程中,會(huì)執(zhí)行以下語句
          Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.password as password0_0_ from user user0_ where user0_.id=?
          Hibernate: select roles0_.user_id as user1_1_, roles0_.role_id as role2_1_, role1_.id as id4_0_ from user_role roles0_ left outer join blog.role role1_ on roles0_.role_id=role1_.id where roles0_.user_id=?
          Hibernate: insert into blog.role (id) values (?)
          Hibernate: insert into user_role (user_id, role_id) values (?, ?)
          可以看到.上面的第四條語句維護(hù)兩個(gè)對(duì)象之間的關(guān)系.如果將上面的user.getRoles().add(role);改成
          role.getUsers().add)(user);由于Role對(duì)象不是關(guān)系的維護(hù)方,在運(yùn)行時(shí)就不會(huì)產(chǎn)生第四條語句,相應(yīng)的
          在第三方表user_role也會(huì)不插入相應(yīng)的記錄.

          刪除關(guān)聯(lián)關(guān)系
          ...
            User user = (User)session.get(User.class, "2c9ab2d514af5a3d0114af5a41f90001");
            Role role = (Role)session.get(Role.class, "2c9ab2d514af97a60114af97abc60001");
            user.getRoles().remove(role);
          ...
          上面的代碼的執(zhí)行,不會(huì)刪除任何JAVA對(duì)象,只會(huì)刪除對(duì)象之間的關(guān)聯(lián)關(guān)系.控制臺(tái)輸出的語句如下
          ......
          Hibernate: delete from user_role where user_id=? and role_id=?
          同樣,如果將user.getRoles().remove(role);語句改換成role.getUsers().remove(user);則控制臺(tái)
          不會(huì)發(fā)出以delete語句.關(guān)聯(lián)關(guān)系不會(huì)被刪除.

            



          posted on 2007-08-29 11:40 Ke 閱讀(341) 評(píng)論(1)  編輯  收藏 所屬分類: hibernate

          FeedBack:
          # re: 映射中的inverse 2008-09-20 17:52 helloklzs
          怎么你舉的例子中,一對(duì)多與多對(duì)多關(guān)系inverse的判斷不太一樣,如何來判斷呢?

          像你的第一個(gè)實(shí)例:一對(duì)多 inverse為false怎么是由message維護(hù)呢?它不是在user.hbm.xml里配制的嗎?我覺得為true時(shí)由message來維護(hù)才是,不是因?yàn)閕nverse為true時(shí),維護(hù)權(quán)由對(duì)方嗎?
          既然這里為true,維護(hù)權(quán)就應(yīng)該在對(duì)方,即在message而不應(yīng)該在user那方;
          而你舉的第二例子:多對(duì)多的,role.hbm.xml里設(shè)置了true就成了user方維護(hù),這個(gè)理解;但這樣一來,一對(duì)多與多對(duì)多inverse的判斷就不一樣了,如何解決呢?  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 岢岚县| 万年县| 峨眉山市| 杭锦旗| 香格里拉县| 舞阳县| 建平县| 柳河县| 龙山县| 余庆县| 城步| 榆社县| 泰顺县| 达拉特旗| 政和县| 商城县| 南通市| 文登市| 盘山县| 柳河县| 晋宁县| 阜新| 贞丰县| 广元市| 旌德县| 汶川县| 广昌县| 祁连县| 朝阳区| 炎陵县| 东城区| 东平县| 永胜县| 涞水县| 赤壁市| 武定县| 德钦县| 宜兰市| 塔河县| 苏尼特左旗| 泰来县|