2017-10-12 2 views
2

Ich verwende Springdaten jpa, um mein Projekt zu erstellen. Es gibt eine Benutzer-Entität und eine Biz-Entität.Jpa-Entity-Beziehung verursacht Endlosschleife

@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private UserInformation belongUser;//所属用户 

Dieser Code ist Teil der Biz-Klasse.

@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser") 
private Set<BizInformation> bizs = new HashSet<BizInformation>(); 

Und das ist ein Teil der Benutzerklasse

Das Problem ist, wenn ich ein UserInfomation über RESTful api zu bekommen, ist es eine BizInfo zurückkehrt, dann innerhalb der BizInfo gibt sie die UserInfomation und verursachte schließlich eine Stackoverflow Exception .

Wie kann ich das lösen? Vielen Dank.

+0

eine Endlosschleife, aber sie nicht sagen. Scheinbar ist das JSON, was absolut nichts mit der JPA-API zu tun hat – DN1

+0

@ DN1 das ist bekannt JSON Serialiser-Verhalten (viele Leute sagen: Fehler, andere: Funktion) –

Antwort

2

Dieses Problem wird durch die bidirektionalen Beziehungen verursacht. Sie können @JsonManagedReference und @JsonBackReference

  • @JsonManagedReference ist der vordere Teil der Referenz verwenden - derjenige, der normalerweise serialisiert wird.
  • @JsonBackReference ist der hintere Teil der Referenz - es wird aus Serialisierung weggelassen werden.

in Ihrem Fall können Sie @JsonManagedReference in Benutzerklasse

@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser") 
@JsonManagedReference 
private Set<BizInformation> bizs = new HashSet<BizInformation>(); 

und @JsonBackReference für Biz-Klasse hinzufügen, die die UserInformation Serialisierung auslassen wird

@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
@JsonBackReference 
private UserInformation belongUser;//所属用户 

Sie können auch @JsonIgnore verwenden für die Klasse, die Sie die Serialisierung weglassen möchten

mehr Details: jackson-bidirectional-relationships-and-infinite-recursion

+0

schöne Frage und schönere Antwort – Acewin

+1

Dies ist ein sehr häufiges Szenario. Leute, die versuchen, Entitäten in json zu marshall/unmarshall zu bringen, vergessen im Allgemeinen die Schleife. – Acewin

+1

Sehr gute Antwort, funktioniert perfekt, danke für Ihre Hilfe – zpwpal

1

Ein weiterer Ansatz ist @JsonIgnoreProperties zu verwenden: irgendwo

@JsonIgnoreProperties("bizs") 
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private UserInformation belongUser; 
Verwandte Themen