2017-04-06 1 views
0

일부 엔티티에서 간단한 CRUD 연산을 수행하기 위해 Spring MVC Rest Controller를 사용하고 있습니다. 잭슨이 @ManyToOne 관계를 올바르게 구현하는 방법을 알아 내려고 애 쓰고 있습니다. Jackon이 관계의 "반대"면을 직렬화하면 "소유"속성이 생략됩니다. Heres는 내 코드를 살펴 :Jackson은 객체의 직렬화를 통해 @OneToMany 관계의 반대면을 생략합니다.

@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; 
} 
} 
내가 전체의 경쟁 엔티티를 직렬화 달성 할 수있는 방법 스포츠 엔티티를 생략하지 않고, 묻고 싶다

?

감사합니다, 데이브

+0

이 개체를 직렬화하려고 했습니까? – ZhenyaM

+0

예, 했어요. 예상대로 개체의 json 표현을 deserialize하지만 경쟁 속성을 직렬화하면 스포츠 속성이 생략됩니까 ??? – DMcg

답변

1

음, (내가 바로 이해한다면) this 대답에 따라, 직렬화에서 @JsonBackReference@JsonManagedReference 쌍은 JSON에 저장 전체 개체, 단지 ID를 의미하지 않습니다. 하지만이 json을 비 직렬화하면 StackOverFlow없이 재귀 연결을 얻을 수 있습니다. 그래서 그것은 행동 (나는 생각합니다 =))을 기대했습니다.

그러나 당신은 당신이 @JsonBackReference@JsonManagedReference를 제거하고 Sport 클래스 competitions 필드 @JsonIgnore를 전달하는 데 필요한 것보다, JSON 전체 객체에 전달해야하지만 직렬화의 재귀 연결이 끊어됩니다.

또한 재귀를위한 Sport 클래스의 자체 디시리얼라이저를 작성할 수 있습니다.

이 정보가 도움이되기를 바랍니다.

+0

예, 잭슨 주석의 예상되는 동작처럼 보입니다. 그 점을 이해하기 위해 시간을 좀 들였습니다. 마침내 해결할 해결책은 맞춤형 비 직렬화기를 구현하는 것이 었습니다. 잘 작동합니다. 당신의 도움을 주셔서 감사합니다 :) – DMcg