Saltar al contenido

La relación Hibernate @OneToMany provoca un bucle infinito o entradas vacías en el resultado JSON

Este grupo de especialistas pasados muchos días de trabajo y de juntar de datos, dieron con la respuesta, nuestro deseo es que resulte útil para ti para tu plan.

Solución:

Solución:

Usar

@JsonManagedReference anotación para los primeros objetos instanciados

@JsonBackReference anotación para los segundos objetos instanciados

Película.java

@JsonManagedReference
@OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set clips = new HashSet();

Clip.java

@JsonBackReference
@ManyToOne
    @JoinColumn(name="movie_id")
    private Movie movie;

Me encontré exactamente con el mismo problema. Probé la solución del párrafo citado, no funcionó para mí.

lo que hice es volver null para getMovie() en la clase Clip, entonces el problema del bucle infinito desaparece. Los datos devueltos en formato JSON se verán como “movieId”:1 … clips:[“clipId”:1, “movie”:”null”, ..].

Si también desea eliminar aún más la propiedad de la película en JSON, agregue la anotación de nivel de clase a la clase Clip @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

Característica de Jackson: evita la serialización de valores nulos, valores predeterminados

Actualización: la forma más fácil que encontré es simplemente eliminar el captador de película en la clase Clip.

Primero, déjame mostrarte por qué establecer el tipo de recuperación en perezoso no ayuda. Cuando intenta serializar su pojo, su serializador (tal vez jackson) llamaría a cada captador de este pojo y usaría el valor devuelto de captador como las propiedades en los datos json. Por lo tanto, llama explícitamente al getter, que llama a hibernate para cargar sus entidades asociadas (película para Clip y clips para Movie). Entonces necesitas usar @JsonIgnoreProperties para deshacerte de este extraño bucle infinito, el código dice así:

Clip.java

    @ManyToOne
    @JoinColumn(name="movie_id")
    @JsonIgnoreProperties("clips")
    private Movie movie;

Movie.java
    @OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JsonIgnoreProperties("movie")
    private Set clips = new HashSet();

De esa manera, encontraría que la película anidada en el objeto clip json no tiene “clips” dentro de la película, y los clips anidados en la película tampoco tienen “película” secundaria.

Supongo que esta es la mejor manera de lidiar con este problema y también la mejor práctica para desarrollar una aplicación web Java.

Nos puedes respaldar nuestro estudio mostrando un comentario o valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *