La relation Hibernate @OneToMany provoque une boucle infinie ou des entrées vides dans un résultat JSON
J'ai deux entités, une entité "film" et une entité "Clip"
chaque élément appartient à un film et un film peut avoir plusieurs clips.
Mon code ressemble à ceci:
Movie.java
@OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Clip> clips = new HashSet<Clip>();
Clip.java
@ManyToOne
@JoinColumn(name="movie_id")
private Movie movie;
Les tables sont générées et chaque élément a une colonne "movie_id" mais cela provoque ma demande de se retrouver dans une boucle infinie quand je suis en demande de Données
@Path("/{id:[0-9][0-9]*}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Movie lookupMovieById(@PathParam("id") long id) {
return em.find(Movie.class, id);
}
result:
{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"M...
C'est le même résultat quand je suis en demandant un clip.
Quand je l'ai changer pour un @ManyToMany relation il n'y aura pas des problèmes comme ça, mais ce n'est pas ce dont j'ai besoin ici. Pouvez-vous m'aider? Réglage fetchType Paresseux n'a pas fonctionné.
Edit: je suis en utilisant le courant de JBoss studio de développement
Edit:
J'ai "résolu", par la lecture de cet article:
http://blog.jonasbandi.net/2009/02/help-needed-mapping-bidirectional-list.html
"À la carte bidirectionnelle un à plusieurs, avec l'un-à-plusieurs côté que le propriétaire de côté, vous devez supprimer le mappedBy élément et réglez le nombre de un les annotations @JoinColumn comme insérable et pouvant être mis à jour à false. Cette solution n'est évidemment pas optimisé et produisent une certaine supplémentaire de mise à JOUR des déclarations."
lorsque je demande un film j'obtiens la réponse suivante:
{"id":1,"version":1,"name":"MSG Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[],"description":"Remorque zu mgs4"}
l'entrée "clips" s'affiche toujours. Est-ce encore de la mauvaise solution ou dois-je vivre avec cela?
source d'informationauteur Goot
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré exactement le même problème. J'ai essayé la solution de la cité, le paragraphe, il ne fonctionne pas pour moi.
Ce que j'ai fait est de retourner la valeur null pour getMovie() dans le Clip de la classe, puis la boucle infinie problème est disparu. Les données retournées au format JSON va ressembler {"movieId":1 clips...: ["clipId":1, "film":"null", ..]}.
Si vous aussi vous souhaitez plus de retirer le film de la propriété en JSON, ajouter le niveau de la classe d'annotation pour le Clip de classe
@JsonSerialize(include=JsonSerialize.L'Inclusion.NON_NULL)
Jackson fonction: empêcher la sérialisation des valeurs nulles, valeurs par défaut
Mise à jour:
La façon la plus facile que j'ai trouvé est de tout simplement retirer de la lecture de film dans le Clip de classe.
Solution:
Utilisation
@JsonManagedReference
annotation pour la première objets instanciés@JsonBackReference
annotation pour la seconde objets instanciésMovie.java
Clip.java
Au lieu de retourner un objet Entité, je vous suggère de retourner un DTO objet uniquement avec les données dont vous avez besoin. Vous pouvez en obtenir un directement à partir d'une requête hql/critères de résultats, en utilisant le résultat de transformateurs.
Comme vous dites "l'entrée des clips apparaît toujours".
Pour éviter les relations données dans la db de la réponse de changement de
fetch = FetchType.EAGER
àfetch = FetchType.Lazy
.Moyen facile comme Dino Tw dit:
Supprimer la
getMovie()
fonction de laClip
classe.Qui vous aidera à récupérer les
Clip
liste pour chaqueMovie
qui est associé parmovie_id
dans leClip
entité/table.