迷失北京

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

              今天找到了一種新的方法來解決這個(gè)問題,hibernate的級聯(lián)關(guān)系解決了不少麻煩事,但是這種情況下卻添了麻煩。下面我說一下解決的思路:將有級聯(lián)關(guān)系的類分離,具體分離為剝離了有映射關(guān)系屬性的dto,和級聯(lián)關(guān)系所映射的dto,然后將分離出來的dto放到map中,這樣用json-lib工具轉(zhuǎn)化的時(shí)候就不會有問題了!

          舉一個(gè)例子

          role = this.roleService.searchRole(id);
                  
                  Role r = new Role();
                  r.setRname(role.getRname());
                  r.setRdescribe(r.getRdescribe());
                  
                  List<Limits> limits = new ArrayList<Limits>();
                  limits.addAll(role.getLimits());
                  
                  Map<String, Object> map = new HashMap<String, Object>();
                  map.put("role", r);
                  map.put("limits", limits);
                  
                  
                  JSONObject jo = JSONObject.fromObject(map);
          

           (上面的是插敘部分,同時(shí)也是對下面這種解決方案不足之處的補(bǔ)充)

           

              今天莫名其妙的遇到了這樣的一個(gè)錯(cuò)誤:net.sf.json.JSONException: There is a cycle in the....大概的意思也知道,但是由于剛剛使用JSON,也沒有加以思考直接上網(wǎng)查了一下。原因是這樣的:hibernate的關(guān)系映射在級聯(lián)查詢的時(shí)候會一連串的查詢出與之相關(guān)的一系列對象(當(dāng)然這是在你配置了對象之間的映射關(guān)系),JSON-lib畢竟做到不是怎么成熟,所以這種形式的數(shù)據(jù)它還沒辦法解析成JSON對象,不過它也提供了一種解決方案下面提到。但是這個(gè)工具包已經(jīng)夠可以了,現(xiàn)在我們已經(jīng)可以把List,Map,pojo對象等直接轉(zhuǎn)換為JSON對象了!

               稍微說了一點(diǎn)廢話,不過也是由于剛剛認(rèn)識JSON心里有點(diǎn)喜悅,下面就來說一下解決的具體辦法,解決方案是這樣

          JsonConfig config = new JsonConfig();
                  config.setJsonPropertyFilter(new PropertyFilter() {
          			public boolean apply(Object arg0, String arg1, Object arg2) {
          				 if (arg1.equals("user") ||arg1.equals("subMessages")) {
          	                    return true;
          	                } else {
          	                    return false;
          	                }
          			}
                  });
          

            

          這里我說明一下這段代碼的作用,他就是提供了一個(gè)過濾作用,如果遇到關(guān)聯(lián)的對象時(shí)他會自動(dòng)過濾掉,不去執(zhí)行關(guān)聯(lián)關(guān)聯(lián)所關(guān)聯(lián)的對象。有可能單獨(dú)看這段代碼不是很容易理解哪呢我貼出我hibernate中的配置關(guān)系映射的代碼幫助理解:

          <!-- 配置用戶與主題帖之間的關(guān)系 -->
          		<many-to-one name="user" class="bbs.po.User" column="user_id"/>
          		
          		<!-- 配置主題帖與回復(fù)的帖子之間的關(guān)系 -->
          		<set name="subMessages" table="sub_message" inverse="true" cascade="all" lazy="false" order-by="date asc">
          			<key column="theme_id" />
          			<one-to-many class="bbs.po.SubMessage" />
          		</set>
          

            

          因?yàn)樵谶@個(gè)類中配置了與user的多對一和與subMessage的一對多,查詢的時(shí)候會關(guān)聯(lián)查詢出一系列的非本類對象,導(dǎo)致Json-lib轉(zhuǎn)換失敗。

          下面我在捎帶說一下JSON-lib這個(gè)類的作用:它就是專門將pojo轉(zhuǎn)換為json對象,或?qū)son對象轉(zhuǎn)換為pojo的。這是它的用法:

          1. JSONArray subMsgs = JSONArray.fromObject(subMessages, config);其中config是可選的,當(dāng)出現(xiàn)上面的情況是可以配置config參數(shù),如果沒有上面的那種需求就可以直接使用fromObject(obj)方法,它轉(zhuǎn)換出來的就是標(biāo)準(zhǔn)的json對象格式的數(shù)據(jù),如下:

          {["attr", "content", ...}, ...]}

          2. JSONObject jTmsg = JSONObject.fromObject(themeMessage, config);這是專門用來解析標(biāo)準(zhǔn)的pojo,或者map對象的,pojo對象的格式就不用說了,map的形式是這樣的{"str", "str"}。當(dāng)然這是我用到的幾個(gè)用法,我也沒有深究,所以說的不對的地方大家多多指教!!

          posted on 2011-03-31 22:08 王康 閱讀(1936) 評論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 桐庐县| 平湖市| 汉源县| 太谷县| 北流市| 平定县| 涟水县| 江陵县| 浪卡子县| 台州市| 怀集县| 大厂| 大方县| 施甸县| 南澳县| 山丹县| 茂名市| 丰县| 剑河县| 西充县| 漳州市| 奇台县| 滨州市| 丰台区| 始兴县| 禄劝| 老河口市| 长春市| 来宾市| 嘉义市| 商城县| 原平市| 五河县| 渝北区| 天镇县| 内丘县| 开化县| 新建县| 无棣县| 宁都县| 卢湾区|