我正在使用Spring和Hibernate构建Restful Web应用程序。对于序列化我使用Jackson库(版本2.x)。
我面临的问题如下:我有一个用户,项目和评级,它们看起来如下:
public class Item {
...
@OneToMany(targetEntity = Rating.class, mappedBy = "rating", orphanRemoval = true)
@Cascade(CascadeType.SAVE_UPDATE)
private Set<Rating> rating = new HashSet<>();
...
}
public class Rating {
...
@ManyToOne(targetEntity = User.class, optional = false)
@JoinColumn(name="user_id")
@JsonIdentityReference(alwaysAsId = true)
private User user;
@ManyToOne(targetEntity = Item.class, optional = false)
@JoinColumn(name="item_id")
@JsonIdentityReference(alwaysAsId = true)
private Item item;
...
}
public class User {
...
@OneToMany(targetEntity = Rating.class, mappedBy = "user", fetch = FetchType.LAZY, orphanRemoval = true)
@JsonIdentityReference(alwaysAsId = true)
@Cascade(CascadeType.SAVE_UPDATE)
private List<Rating> ratings = new ArrayList<Rating>();
...
}
现在,如果我尝试为特定用户保存项目的新评级,请使用执行以下操作的方法:
if(formerVoting != null) { //Previously fetched from the DB
item.removeUserRating(formerVoting);
}
Rating newRating = new Rating(); //Create new Rating
newRating.setRating(rating);
newRating.setItem(item);
newRating.setUser(user);
user.addRating(newRating);
stop.addRating(newRating);
userDao.update(user);
stopDao.update(stop);
return stop;
这一点也有效,但是当杰克逊试图序列化我从我的控制器返回的ResponseEntity
时,它就会冻结。
我确认mehtod返回并调整了级联但没有任何帮助。有谁知道我做错了什么?
BR, wastl
修改
我终于弄清楚问题是什么:
我为项目字段使用了自定义序列化程序,它引发了异常。显然杰克逊没有妥善处理这个异常,服务器只是没有返回任何东西。
答案 0 :(得分:0)
User
和Rating
之间存在双向关系。 Hibernate通常可以优雅地处理循环引用,但Jackson需要一些工作(实际上,只要你将对象图强制转换为树结构,这就是一个潜在的问题)。你必须决定如何序列化你的对象;如果User
是顶级对象(JSON树的根目录),那么您需要告诉Jackson忽略user
中的Rating
字段。否则,它将陷入无限递归。
@Cascade
注释与杰克逊无关,所以暂时不要忘记。