0

我目前正在使用 Play!2.0.4 与 Ebean 和杰克逊。我在用户和联系人之间有 OneToMany 关系。我正在使用 Jacksons ObjectMapper 将对象转换为 json,但是在转换过程中我遇到了循环引用的问题。

class User extends Model {
    List<Contact> contacts;
}

class Contact extends Model {
    User user;
}

我想获取所有联系人的列表,并将此列表转换为 json,包括将其链接到用户的外键,但不需要用户表本身的任何数据。

目前我在使用 ObjectMapper 创建此列表时遇到 StackOverflowError 。我明白为什么,但不知道如何最好地解决它。

我省略了任何我认为不相关的注释和代码,但如果需要更多代码,请告诉我。

4

2 回答 2

2

我没有使用 Play 框架,但是 JPA 允许您将 OneToMany 或 ManyToMany 关系从一个实体映射到另一个实体。然后在第二个实体中,它向后读取相同的关系,所以只有一个关系。您的问题听起来像您有两种关系,一种是双向的。

为您的 User 类中的联系人成员查找与 @OneToMany(mappedBy="user") 等效的 Play eBean。

于 2012-11-09T22:05:37.577 回答
0

也许您需要获取 List o 结果,对其进行迭代并创建仅包含所需数据的新 List。我不确定 ObjectMapper,但是我有类似的问题,似乎 toJson() 方法强制构建具有所有关系的整个对象。

从那个问题开始,我构建了一些 JSON API,并记住了那段经历,我决定为每一行手动构建新对象。我的一些 API 可以(应该)返回大型数据集,因此仔细选择数据对我来说很重要,没有多余的(未使用的)字段等。即。像这样

public static Result jsonAll(){

    // initiate empty result List
    List results = new ArrayList();

    List<Marker> tasks = Marker.find.select("id, name").findList();
    for (Marker task : tasks) {

        // build 'item'
        Map<String, Object> item = new HashMap<String, Object>();
        item.put("id", task.id);
        item.put("name", task.name);

        // add the 'item' to 'results'
        results.add(item);

    }

    // return all as JSON
    return ok(Json.toJson(results));
}

当然,您需要获取关系,因此您需要向查找器添加fetch()语句并指向要选择的确切关系和字段。

于 2012-11-09T22:18:34.777 回答