今天找到了一種新的方法來解決這個(gè)問題,hibernate的級(jí)聯(lián)關(guān)系解決了不少麻煩事,但是這種情況下卻添了麻煩。下面我說一下解決的思路:將有級(jí)聯(lián)關(guān)系的類分離,具體分離為剝離了有映射關(guān)系屬性的dto,和級(jí)聯(lián)關(guān)系所映射的dto,然后將分離出來的dto放到map中,這樣用json-lib工具轉(zhuǎn)化的時(shí)候就不會(huì)有問題了!
舉一個(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í)也是對(duì)下面這種解決方案不足之處的補(bǔ)充)
今天莫名其妙的遇到了這樣的一個(gè)錯(cuò)誤:net.sf.json.JSONException: There is a cycle in the....大概的意思也知道,但是由于剛剛使用JSON,也沒有加以思考直接上網(wǎng)查了一下。原因是這樣的:hibernate的關(guān)系映射在級(jí)聯(lián)查詢的時(shí)候會(huì)一連串的查詢出與之相關(guān)的一系列對(duì)象(當(dāng)然這是在你配置了對(duì)象之間的映射關(guān)系),JSON-lib畢竟做到不是怎么成熟,所以這種形式的數(shù)據(jù)它還沒辦法解析成JSON對(duì)象,不過它也提供了一種解決方案下面提到。但是這個(gè)工具包已經(jīng)夠可以了,現(xiàn)在我們已經(jīng)可以把List,Map,pojo對(duì)象等直接轉(zhuǎn)換為JSON對(duì)象了!
稍微說了一點(diǎn)廢話,不過也是由于剛剛認(rèn)識(shí)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)的對(duì)象時(shí)他會(huì)自動(dòng)過濾掉,不去執(zhí)行關(guān)聯(lián)關(guān)聯(lián)所關(guān)聯(lián)的對(duì)象。有可能單獨(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的多對(duì)一和與subMessage的一對(duì)多,查詢的時(shí)候會(huì)關(guān)聯(lián)查詢出一系列的非本類對(duì)象,導(dǎo)致Json-lib轉(zhuǎn)換失敗。
下面我在捎帶說一下JSON-lib這個(gè)類的作用:它就是專門將pojo轉(zhuǎn)換為json對(duì)象,或?qū)son對(duì)象轉(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對(duì)象格式的數(shù)據(jù),如下:
{["attr", "content", ...}, ...]}
2. JSONObject jTmsg = JSONObject.fromObject(themeMessage, config);這是專門用來解析標(biāo)準(zhǔn)的pojo,或者map對(duì)象的,pojo對(duì)象的格式就不用說了,map的形式是這樣的{"str", "str"}。當(dāng)然這是我用到的幾個(gè)用法,我也沒有深究,所以說的不對(duì)的地方大家多多指教!!