【发布时间】:2015-08-25 04:10:46
【问题描述】:
当我将 JSON 对象发布到我的 REST API(使用 Spring 和 Hibernate)时,我无法弄清楚为什么关系的拥有方没有在另一方持续存在。
带有id字段的映射超类:
@MappedSuperClass
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 11538918560302121L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
....
}
拥有类(扩展NamedEntity,而后者又扩展BaseEntity):
@Entity
@DynamicUpdate
@SelectBeforeUpdate
@NamedQuery(name = "Chain.byId", query = "from Chain where id=:id")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope=Chain.class)
public class Chain extends NamedEntity {
private static final long serialVersionUID = 4727994683438452454L;
@OneToMany(mappedBy = "chain", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Campaign> campaigns = new ArrayList<Campaign>();
....
}
所属类:
@Entity
@DynamicUpdate
@SelectBeforeUpdate
@NamedQuery(name = "Campaign.byId", query = "from Campaign where id=:id")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope=Campaign.class)
public class Campaign extends NamedEntity {
@ManyToOne
@JoinColumn(name = "chain_id")
private Chain chain;
....
}
我的RestController的相关部分:
@RequestMapping(value = "new", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@ResponseBody
public Chain saveChain(@RequestBody Chain chain) {
chainDAO.saveChain(chain);
return chain;
}
JSON 请求正文:
{
"name": "mcdonald's",
"campaigns": [
{
"name": "summer1"
}
]
}
JSON 响应正文的相关部分:
{
"id": 1,
"name": "mcdonald's",
"campaigns": [
{
"id": 1,
"name": "summer1",
"rewards": [],
"startDate": null,
"endDate": null,
"chain": null,
"surveys": [],
"achievements": []
}
],
"rewards": []
}
我怀疑这实际上是使用 @JsonIdentityInfo 注释打破无限递归时的预期行为?但是,当我尝试请求刚刚使用其 id 字段创建的 Chain 时,我看不到嵌套对象(Campaign ) 了。
我用来检索我刚刚创建的 Chain 对象的 GET 方法:
@RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public Chain getChain(Model model, @PathVariable int id) {
Chain chain = chainDAO.getChainById(id).get(0);
return chain;
}
GET 方法的 JSON 响应正文:
{
"id": 1,
"name": "mcdonald's",
"campaigns": [],
"rewards": [],
"managers": [],
"locations": []
}
如您所见,这个 Chain 对象中的 campaigns 数组现在是空的。
【问题讨论】:
标签: java json spring hibernate jackson