Hibernate 对象的Jackson序列化忽略了@OneToMany关系的反转面

Hibernate 对象的Jackson序列化忽略了@OneToMany关系的反转面,hibernate,jackson,Hibernate,Jackson,我正在使用Spring MVC Rest控制器对一些实体执行一些简单的CRUD操作。我正在和Jackson进行一点斗争,试图找出如何正确实施@manytone关系。当Jacskon序列化关系的“反向”端时,它会忽略“拥有”属性。下面是我的代码: @Entity public class Competition { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name;

我正在使用Spring MVC Rest控制器对一些实体执行一些简单的CRUD操作。我正在和Jackson进行一点斗争,试图找出如何正确实施@manytone关系。当Jacskon序列化关系的“反向”端时,它会忽略“拥有”属性。下面是我的代码:

@Entity
public class Competition {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String name;

private String nameInUrl;

@ManyToOne(cascade = CascadeType.ALL)
@JsonIdentityReference(alwaysAsId=true)
@JsonBackReference(value="test")
private Sport sport;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getNameInUrl() {
    return nameInUrl;
}

public void setNameInUrl(String nameInUrl) {
    this.nameInUrl = nameInUrl;
}

public Sport getSport() {
    return sport;
}

public void setSport(Sport sport) {
    this.sport = sport;
}
}

@Entity
public class Sport {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String name;

private String nameInUrl;
@OneToMany(cascade = CascadeType.ALL, mappedBy="sport")
@JsonManagedReference(value="test")
private Set<Competition> competitions = new HashSet<Competition>();

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getNameInUrl() {
    return nameInUrl;
}

public void setNameInUrl(String nameInUrl) {
    this.nameInUrl = nameInUrl;
}

public Set<Competition> getCompetitions() {
    return competitions;
}

public void setCompetitions(Set<Competition> competitions) {
    this.competitions = competitions;
}
}
@实体
公开课比赛{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
私有字符串名称inURL;
@多通(级联=级联类型.ALL)
@JsonIdentityReference(alwaysAsId=true)
@JsonBackReference(value=“test”)
私人体育;
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getNameInUrl(){
返回nameInUrl;
}
public void setNameInUrl(字符串nameInUrl){
this.nameInUrl=nameInUrl;
}
公共体育{
回归运动;
}
公共体育(体育){
这个运动=运动;
}
}
@实体
公共体育课{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
私有字符串名称inURL;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“sport”)
@JsonManagedReference(value=“test”)
私有集竞争=新HashSet();
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getNameInUrl(){
返回nameInUrl;
}
public void setNameInUrl(字符串nameInUrl){
this.nameInUrl=nameInUrl;
}
公开赛{
返回比赛;
}
公开赛(集合赛){
这就是比赛;
}
}
我想问一下,如何在不忽略体育实体的情况下,实现竞赛实体的整体序列化

谢谢,Dave

好吧,根据答案(如果我理解正确),
@JsonBackReference
@JsonManagedReference
对序列化并不意味着将整个对象存储在json中,只需id。但是,当您反序列化此json时,您将获得递归连接,而不需要
堆栈溢出
。所以它期望行为(我想=))

但如果需要传入json整个对象,则需要删除
@JsonBackReference
@JsonManagedReference
并在
Sport
类的
@JsonIgnore
字段中传递
@JsonIgnore
,但在反序列化过程中会丢失递归连接

此外,您还可以尝试为
Sport
类编写自己的反序列化程序,以实现递归


我希望这将对您有所帮助。

您是否尝试序列化此对象?是的,我尝试过。对象的json表示按预期进行反序列化,但当我序列化竞争对象时,sport属性被忽略了??是的,它看起来确实像Jackson注释的预期行为。我花了一些时间才弄明白。我最终采用的解决方案是实现一个自定义反序列化程序。很好。谢谢你的帮助:)