今天找到了一種新的方法來解決這個問題,hibernate的級聯關系解決了不少麻煩事,但是這種情況下卻添了麻煩。下面我說一下解決的思路:將有級聯關系的類分離,具體分離為剝離了有映射關系屬性的dto,和級聯關系所映射的dto,然后將分離出來的dto放到map中,這樣用json-lib工具轉化的時候就不會有問題了!
舉一個例子
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);
(上面的是插敘部分,同時也是對下面這種解決方案不足之處的補充)
今天莫名其妙的遇到了這樣的一個錯誤:net.sf.json.JSONException: There is a cycle in the....大概的意思也知道,但是由于剛剛使用JSON,也沒有加以思考直接上網查了一下。原因是這樣的:hibernate的關系映射在級聯查詢的時候會一連串的查詢出與之相關的一系列對象(當然這是在你配置了對象之間的映射關系),JSON-lib畢竟做到不是怎么成熟,所以這種形式的數據它還沒辦法解析成JSON對象,不過它也提供了一種解決方案下面提到。但是這個工具包已經夠可以了,現在我們已經可以把List,Map,pojo對象等直接轉換為JSON對象了!
稍微說了一點廢話,不過也是由于剛剛認識JSON心里有點喜悅,下面就來說一下解決的具體辦法,解決方案是這樣
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;
}
}
});
這里我說明一下這段代碼的作用,他就是提供了一個過濾作用,如果遇到關聯的對象時他會自動過濾掉,不去執行關聯關聯所關聯的對象。有可能單獨看這段代碼不是很容易理解哪呢我貼出我hibernate中的配置關系映射的代碼幫助理解:
<!-- 配置用戶與主題帖之間的關系 -->
<many-to-one name="user" class="bbs.po.User" column="user_id"/>
<!-- 配置主題帖與回復的帖子之間的關系 -->
<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>
因為在這個類中配置了與user的多對一和與subMessage的一對多,查詢的時候會關聯查詢出一系列的非本類對象,導致Json-lib轉換失敗。
下面我在捎帶說一下JSON-lib這個類的作用:它就是專門將pojo轉換為json對象,或將json對象轉換為pojo的。這是它的用法:
1. JSONArray subMsgs = JSONArray.fromObject(subMessages, config);其中config是可選的,當出現上面的情況是可以配置config參數,如果沒有上面的那種需求就可以直接使用fromObject(obj)方法,它轉換出來的就是標準的json對象格式的數據,如下:
{["attr", "content", ...}, ...]}
2. JSONObject jTmsg = JSONObject.fromObject(themeMessage, config);這是專門用來解析標準的pojo,或者map對象的,pojo對象的格式就不用說了,map的形式是這樣的{"str", "str"}。當然這是我用到的幾個用法,我也沒有深究,所以說的不對的地方大家多多指教!!