2015-07-09 1 views

Antwort

28

@JsonManagedReference ist der vordere Teil der Referenz - derjenige, der normal serialisiert wird. @JsonBackReference ist der hintere Teil von Referenz - es wird aus der Serialisierung weggelassen.

So hängen sie wirklich auf die Richtung Ihrer Beziehung

public class User { 
    public int id; 
    public String name; 

    @JsonBackReference 
    public List<Item> userItems; 
} 

public class Item { 
    public int id; 
    public String itemName; 

    @JsonManagedReference 
    public User owner; 
} 
+0

http://www.baeldung.com/jackson-bidirectional-relationships-and -infinite-recursion –

3

@JsonManagedReference und @JsonBackReference ausgelegt sind, diese Zwei-Wege-Verknüpfung zwischen den Feldern zu handhaben, eine für Eltern Rolle, die andere für Kinder Rolle.

Für das Problem zu vermeiden, werden Gestänge so gehandhabt, dass die Eigenschaft mit @JsonManagedReference Anmerkung kommentierte normalerweise behandelt wird (in der Regel serialisiert, keine Sonderbehandlung für die Deserialisierung) und die Eigenschaft mit @JsonBackReference Anmerkung kommentierte ist nicht serialisiert; und während der Deserialisierung wird der Wert auf die Instanz gesetzt, die den Link "verwaltet" (vorwärts) hat.

+1

Wenn @JsonBackReference-Annotation nicht serialisiert ist, wie wird es dann "deserialisiert", ohne zuerst serialisiert zu werden? –

2
  • @JsonManagedReference -> Leitet den vorderen Teil des Referenz und die durch diese Anmerkung gekennzeichneten Felder sind diejenigen, die
  • @JsonBackReference Serialized bekommen -> Leitet den umgekehrten Teil des Referenz und die Felder/Sammlungen, die mit dieser Anmerkung markiert sind, werden nicht serialisiert.

Anwendungsfall: Sie haben eine ein-oder n-viele-Beziehungen in Ihren Entitäten/Tabellen und nicht die oben mit Fehlern wie

Infinite Recursion and hence stackoverflow - > Could not write content: Infinite recursion (StackOverflowError) 

Die obigen Fehler führen würde tritt auf, weil Jackson (oder etwas Ähnliches) versucht, beide Enden der Beziehung zu serialisieren und endet in einer Rekursion.

@JsonIgnore führt ähnliche Funktionen durch, aber die oben genannten Anmerkungen sind vorzuziehen.

3

Ich ziehe
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
wo Eigenschaft der Name des Primärschlüsselfeld ist und der Umfang ist Typ es

Verwandte Themen