2016-04-12 7 views
2

Ich habe zwei Klassen:@jsonbackreference nicht bindet Beziehung

Person.java:

@Entity 
@PrimaryKeyJoinColumn(name="owner_id") 
public class Person extends Owner { 

    @ManyToOne 
    @JoinColumn(name = "car_sharing_id") 
    @JsonBackReference 
    private CarSharing carSharing; 
} 

CarSharing.java:

@Entity 
public class CarSharing extends MetadataEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @OneToOne 
    @JoinColumn(name = "owner_id", nullable = false) 
    @NotNull 
    private Person owner; 

    @OneToMany(mappedBy = "carSharing", cascade = CascadeType.ALL) 
    @Valid 
    private Set<Person> members; 
} 

ich @JsonBackReference bin mit unendlichen Zyklen zu vermeiden. Die CarSharing Klasse funktioniert einwandfrei das Problem tritt nur mit der Person Klasse.

Die Person scheint die carSharing Eigenschaft zu ignorieren. Wie es null ist, wenn Sie zum Server zurückkommen, wird das Update die Verknüpfung zu der carsharing_id in der Tabelle aufheben.

Stoppen der Schleife ist in Ordnung, aber ich würde auch die carSharing in der Person Klasse zur Verfügung.

Irgendeine Idee, wie man das löst?

Antwort

1

Wenn Sie Jackson 2.x verwenden, können Sie die Annotation verwenden @JsonIdentityInfo:

Ob Objektidentität Informationen verwendet werden soll, zu bestimmen, wie Eigenschaftswert serialisiert/deserialisiert zu/von JSON (und andere Datenformate) basieren auf der Existenz (oder dem Fehlen davon) der @ JsonIdentityInfo Annotation.
sehen: http://wiki.fasterxml.com/JacksonFeatureObjectIdentity

Zum Beispiel, wenn Sie die Klasse mit Anmerkungen versehen CarSharing:

import com.fasterxml.jackson.annotation.JsonIdentityInfo; 
import com.fasterxml.jackson.annotation.ObjectIdGenerators; 
//... 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class CarSharing { 

das JSON Ergebnis einer Person (ich einen Feldnamen zu dieser Klasse hinzugefügt) ist:

{ 
    "carSharing": { 
     "@id": 1, 
     "id": 12345, 
     "owner": { 
     "carSharing": 1, 
     "name": "owner" 
     }, 
     "members": [ 
     { 
      "carSharing": 1, 
      "name": "owner" 
     }, 
     { 
      "carSharing": 1, 
      "name": "driver2" 
     }, 
     { 
      "carSharing": 1, 
      "name": "driver" 
     } 
     ] 
    }, 
    "name": "driver2" 
    } 

Und eine CarSharing-Instanz mit id=12345:

{ 
    "@id": 1, 
    "id": 12345, 
    "owner": { 
     "carSharing": 1, 
     "name": "owner" 
    }, 
    "members": [ 
     { 
     "carSharing": 1, 
     "name": "owner" 
     }, 
     { 
     "carSharing": 1, 
     "name": "driver2" 
     }, 
     { 
     "carSharing": 1, 
     "name": "driver" 
     } 
    ] 
    } 

Das Feld @id wird von jackson generiert. Wenn das referenzierte Objekt nicht serialisiert ist, wird der Wert auf @id des referenzierten Objekts gesetzt.

+0

danke ich denke, es funktioniert jetzt. – user2316219