JsonManagedReference vs JsonBackReference

Me gustaría saber la diferencia entre @JsonManagedReference y @JsonBackReference en Jackson?

@JsonManagedReference es la parte delantera de referencia, la que se serializa normalmente. @JsonBackReference es la parte posterior de la referencia; se omitirá de la serialización.

Entonces realmente dependen de la dirección de tu relación

 public class User { public int id; public String name; @JsonBackReference public List userItems; } public class Item { public int id; public String itemName; @JsonManagedReference public User owner; } 

@JsonManagedReference y @JsonBackReference están diseñados para manejar este enlace bidireccional entre los campos, uno para el rol de Padre, el otro para el rol de Niño.

Para evitar el problema, el enlace se maneja de manera tal que la propiedad anotada con la anotación @JsonManagedReference se maneja normalmente (serializada normalmente, sin manejo especial para la deserialización) y la propiedad anotada con la anotación @JsonBackReference no se serializa; y durante la deserialización, su valor se establece en la instancia que tiene el enlace “administrado” (hacia adelante).

yo prefiero
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
donde propiedad es el nombre del campo de clave principal y el scope es Tipo de

  • @JsonManagedReference -> Administra la parte delantera de la referencia y los campos marcados con esta anotación son los que se serializan
  • @JsonBackReference -> Administra la parte inversa de la referencia y los campos / colecciones marcados con esta anotación no están serializados.

Caso de uso: usted tiene una relación uno-muchos o muchos-muchos en sus entidades / tablas y no usar lo anterior podría generar errores como

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

Los errores anteriores ocurren porque Jackson (o algún otro similar) intenta serializar ambos extremos de la relación y termina en una recursión.

@JsonIgnore realiza funciones similares, pero las anotaciones mencionadas anteriormente son preferibles.