今天找到了一种新的方法来解决这个问题,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"}。当然这是我用到的几个用法,我也没有深究,所以说的不对的地方大家多多指教!!