J'ai un père (programme) avec une relation plusieurs-à-plusieurs avec leurs enfants (abonné). Le problème est lorsqu'il sérialise un programme, il sérialise également les abonnés du programme, ce qui implique de sérialiser leurs programmes, ce qui implique de sérialiser leurs abonnés, jusqu'à ce qu'il ait sérialisé chaque abonné & du programme dans la base de données.Sérialisation cyclique avec plusieurs à plusieurs relation avec Hibernate
Le ERD ressemble à: Programme < -> Abonné
Cela signifie ce qui était un petit bloc de 17KB des données (JSON) étant de retour est devenu un retour de 6.9MB. Ainsi, à son tour, souffle le temps de sérialiser les données et ensuite le renvoyer. Pourquoi mon parent retourne-t-il des enfants qui retournent chez des parents qui retournent des enfants? Comment puis-je arrêter cela afin que je reçoive seulement les abonnés pour chaque programme? Je suppose que j'ai fait quelque chose de mal avec mes annotations, peut-être? Je voudrais maintenir une relation plusieurs-à-plusieurs, mais sans cette récupération de données profondément imbriquée.
(Note:..? Je l'ai essayé avant d'ajouter autant de annotations Lazy je peux trouver juste pour voir si cela aide Cela ne peut-être pas, je fais ce mal aussi)
Program.java
@Entity
@Table(name="programs")
public class Program extends Core implements Serializable, Cloneable {
...
@ManyToMany()
@JoinTable(name="program_subscribers",
joinColumns={@JoinColumn(name="program_uid")},
inverseJoinColumns={@JoinColumn(name="subscriber_uid")})
public Set<Subscriber> getSubscribers() { return subscribers; }
public void setSubscribers(Set<Subscriber> subscribers) { this.subscribers = subscribers; }
Subscriber.java
@Entity
@Table(name="subscribers")
public class Subscriber extends Core implements Serializable {
...
@ManyToMany(mappedBy="subscribers")
public Set<Program> getPrograms() { return programs; }
public void setPrograms(Set<Program> programs) { this.programs = programs;
}
mise en œuvre
public Collection<Program> list() {
return new Programs.findAll();
}
Il s'agit d'un projet à moi, je ne suis pas à 100% ce qui est utilisé pour la sérialisation JSON. Je vois des références à com.sdicons.json.mapper.JSONMapper.SimpleMapperHelper. Et nous avons une méthode publique JSONValue toJSON (Object pojo) throws MapperException {}. (devinez que cela roule votre propre sérialisation) –
Aussi si j'annote getPrograms() @XmlTransient ceci signifierait que je pourrais ne jamais avoir les programmes d'abonné retournés? –
oui. L'autre était de personnaliser votre mapper pour prendre soin du cycle manuellement. – Bozho