我目前正在使用Play! 2.0.4与Ebean和Jackson合作。我在User和Contact之间有一个OneToMany关系。我正在使用Jacksons ObjectMapper将对象转换为json,但我在转换过程中遇到了循环引用的问题。
class User extends Model {
List<Contact> contacts;
}
class Contact extends Model {
User user;
}
我想获取所有联系人的列表,并将此列表转换为json,包括将其链接到用户的外键,但不需要User表本身的任何数据。
目前我在使用ObjectMapper创建此列表时遇到StackOverflowError。我理解为什么,但不知道如何最好地解决它。
我省略了我认为不相关的任何注释和代码,但如果需要更多代码,请告诉我。
答案 0 :(得分:2)
我没有使用Play框架,但JPA允许您将OneToMany或ManyToMany关系从一个实体映射到另一个实体。然后在第二个实体中,它向后读取相同的关系,因此只有一个关系。你的问题听起来像是你有两种关系,一种是单向关系。
在User类中查找与@OneToMany相同的Play eBean(mappedBy =“user”)。
答案 1 :(得分:0)
也许您需要获取List o结果,迭代它并创建仅包含所需数据的新List。我不确定ObjectMapper,但是我有similar problem并且似乎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()
statement添加到查找程序并指出要选择的确切关系和字段。