# bidirektionale OneToMany Endlosschleife



## krel (22. Nov 2012)

Hallo zusammen,

ich habe folgende beiden Klassen, vor der ich die Vereine über eine Restschnittstelle als JSON auslieferen möchte.

```
public class Verein implements Serializable, IdAcc {
  @Basic(optional = false)
  @Column(name = "adresse")
  private String adresse;
  @Basic(optional = false)
  @Column(name = "plz")
  private String plz;
  @Basic(optional = false)
  @Column(name = "stadt")
  private String stadt;
  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "verein_id")
  private Integer vereinId;
  @Basic(optional = false)
  @Column(name = "name")
  private String name;
  @OneToMany(mappedBy = "verein")
  private Collection<Boot> bootCollection;
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "verein")
  private Collection<Benutzer> benutzerCollection;
  @OneToMany(mappedBy = "verein")
  private Collection<Protektor> protektorCollection;
  @OneToMany(mappedBy = "verein")
  private Collection<Ruderer> rudererCollection;
..
}
```


```
public class Protektor implements Serializable, IdAcc {
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "obmann")
  private Collection<Meldung> meldungCollection;
  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "protektor_id")
  private Integer protektorId;
  @Lob
  @Column(name = "name")
  private String name;
  @Lob
  @Column(name = "strasse")
  private String strasse;
  @Lob
  @Column(name = "hausnummer")
  private String hausnummer;
  @Column(name = "plz")
  private Integer plz;
  @Lob
  @Column(name = "ort")
  private String ort;
  @Lob
  @Column(name = "email")
  private String email;
  @Lob
  @Column(name = "telefon")
  private String telefon;
  @JoinColumn(name = "verein", referencedColumnName = "verein_id")
  @ManyToOne
  private Verein verein;
..
}
```
 Probelematisch ist derzeit, dass wenn ich so eine Endlosschleife generiere, denn die _protektorCollection _hat ja Prorektoren, die wiederum auf die Vereine verweisen, und die wiederrum auf die Protektorenliste. Gibt es ne Möglichkeit diese, ich nenne es mal "Rekursion" zu umgehen? Ich möchte alle Vereine mit ihren dazugehörigen Protektoren, die wiederum ihre Vereine kennen müssen. 
Vielen Dank schonmal für Hinweise


----------



## SlaterB (23. Nov 2012)

was bedeutet 'Endlosschleife generieren'?
ernstzunehmende Frameworks wie Hibernate, Serialisierung usw. sollten solche Fälle behandeln,
bereits bekannte Objekte werden nicht mehr erneut geladen/ gespeichert/ initialisiert usw.
oder doch allgemeine Probleme?

oder ist eigener Code gemeint? der muss halt auch entsprechend gebaut sein


----------



## krel (23. Nov 2012)

Ich benutze Eclipselink mit JPA 2.0, habe vorhin aber auch Hibernate in Version 4.1.8 ausprobiert. Hier sind mal die JSON Daten, damit man sich das vorstellen kann. In der untersten Zeile mit "verein" würde es jetzt wieder losgehen und irgendwann bricht die Generierung halt ab. Vielleicht liegt es auch eher an Jackson als an der Persistence Unit. Trotzdem wer eine Idee?

```
[
   {
      "adresse":"adresse",
      "plz":"49593",
      "stadt":"Bersenbrück",
      "vereinId":1,
      "name":"Ruderteam",
      "protektorCollection":[
         {
            "protektorId":1,
            "name":"Hans Egon",
            "strasse":"Musterstraße",
            "hausnummer":"31",
            "plz":12345,
            "ort":"Musterstadt",
            "email":"test@test.com",
            "telefon":"0123-456789",
            "verein":{
               "adresse":"adresse",
               "plz":"49593",
               "stadt":"Bersenbrück",
               "vereinId":1,
               "name":"Ruderteam",
               "protektorCollection":[
                  {
                     "protektorId":1,
                     "name":"Hans Egon",
                     "strasse":"Musterstraße",
                     "hausnummer":"31",
                     "plz":12345,
                     "ort":"Musterstadt",
                     "email":"test@test.com",
                     "telefon":"0123-456789",
                     "verein": [...] <--- Problem
                  }
               ]
            }
         ]
```


----------



## SlaterB (23. Nov 2012)

die grundsätzliche Alternative ist, in Unterlisten nur Namen/ Ids aufzunehmen statt ganze Objekte,
in der Textdarstellung müsste es letztlich auf jeden Fall so sein,

ob man es aber (allein mit dem Framework) hinbekommt, dass nach Java-Einlesen alles bereits wieder bestens als Objekte vorliegt, kann ich leider nicht sagen,
wenn man manuell überarbeitet, kann man natürlich die Kurzdarstellungen zur Suche nach den richtigen Objekten verwenden, zweite Listen befüllen usw.


----------



## krel (23. Nov 2012)

mmh... sonst muss ich im Client halt hingehen und die Protektorenliste jeweils laden, ist zwar n bisschen mehr Aufwand aber da das ganze nicht zeitkritisch ist kann man das vertreten.


----------



## SlaterB (23. Nov 2012)

ich bin gerade auf den Suchbegriff 'json circular reference' gekommen,
damit kannst du dich vielleicht allgemein informieren,

z.B. mächtig passend aussehend:
java - How to solve circular reference in json serializer caused by hibernate bidirectional mapping? - Stack Overflow


----------



## krel (23. Nov 2012)

das war die richtige Richtung. Danke für den Tipp. Seit Jackson 2.0 gibt es die Object Identities(JacksonFeatureObjectIdentity - FasterXML Wiki), welche genau dieses Problem beheben. Anschließend musste ich noch Jersey entsprechend How can I customize serialization of a list of JAXB objects to JSON? - Stack Overflow anpassen und schon kommt sowas schönes dabei raus:

```
[

    {
        "@id": 1,
        "adresse": "straße",
        "plz": "12345",
        "stadt": "Stadt",
        "vereinId": 1,
        "name": "Ruderteam",
        "protektorCollection": [
            {
                "@id": 2,
                "protektorId": 1,
                "name": "Name",
                "strasse": "Musterstraße",
                "hausnummer": "31",
                "plz": 123456,
                "ort": "musterstadt",
                "email": "test@test.de",
                "telefon": "1234-546789",
                "verein": 1
            }
        ]
    },
...
}]
```

vielen Dank für diesen Tipp!


----------

