今天找到了一種新的方法來解決這個(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è)用法,我也沒有深究,所以說的不對的地方大家多多指教!!