2015-11-02 11 views
6

Ho un progetto che si occupa di una mappatura ORM di oggetti (ci sono alcune relazioni @OneToMany ecc.).Avvio a molla JPA - JSON senza oggetto nidificato con relazione OneToMany

Sto utilizzando l'interfaccia REST per trattare questi oggetti e Spring JPA per gestirli nell'API.

Questo è un esempio di uno dei miei POJO:

@Entity 
public class Flight { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private String name; 
    private String dateOfDeparture; 
    private double distance; 
    private double price; 
    private int seats; 

    @ManyToOne(fetch = FetchType.EAGER) 
    private Destination fromDestination; 

    @ManyToOne(fetch = FetchType.EAGER) 
    private Destination toDestination; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "flight") 
    private List<Reservation> reservations; 
} 

Quando si effettua una richiesta, devo specificare tutto nel JSON:

{ 
    "id": 0, 
    "reservations": [ 
    {} 
    ], 
    "name": "string", 
    "dateOfDeparture": "string", 
    "distance": 0, 
    "price": 0, 
    "seats": 0, 
    "from": { 
    "id": 0, 
    "name": "string" 
    }, 
    "to": { 
    "id": 0, 
    "name": "string" 
    } 
} 

Quello che io preferirei, è in realtà specificando l'id dell'oggetto referenziato invece dei loro corpi interi, come questo:

{ 
    "id": 0, 
    "reservations": [ 
    {} 
    ], 
    "name": "string", 
    "dateOfDeparture": "string", 
    "distance": 0, 
    "price": 0, 
    "seats": 0, 
    "from": 1, 
    "to": 2 
} 

È anche possibile ble? Qualcuno potrebbe darmi qualche idea su come farlo? Sto solo cercando tutorial su come fare il contrario (la soluzione che ho già).

+0

Puoi provare a trovare questo utile - http://wiki.fasterxml.com/JacksonFeatureObjectIdentity – VadymVL

risposta

14

Sì, è possibile.

A questo scopo si consiglia di utilizzare paio di Jackson annotazioni al modello di entità:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 
@JsonIdentityReference(alwaysAsId = true) 
protected Location from; 

tuo JSON serializzato cercherà invece di questo:

{ 
    "from": { 
     "id": 3, 
     "description": "New-York" 
    } 
} 

come questo:

{ 
    "from": 3 
} 

Come indicato in official documentation:

@JsonIdentityReference - annotazioni opzionale che può essere utilizzato per i dettagli di personalizzazione di un riferimento a oggetti per i quali "oggetto Identità" è abilitata (vedi JsonIdentityInfo)

alwaysAsId = true utilizzato come marcatore per indicare se tutti riferimento i valori devono essere serializzati come id (true);

Nota che se viene utilizzato il valore di 'vero', deserializzazione può richiedere informazioni contestuali supplementari, ed eventualmente utilizzando un ID personalizzato resolver - la gestione predefinita potrebbe non essere sufficiente.

+0

Questo è stato davvero utile, grazie! – Jerry

+0

è necessario @JsonIdentityInfo qui? – kiedysktos

+0

@kiedysktos si. – VadymVL

1

È possibile ignorare il contenuto JSON solo utilizzando l'annotazione @JsonIgnore. Il campo che vuoi nascondere nel tuo JSON lì puoi annotare quello con @JsonIgnore. Puoi cambiare il tuo JSON in questo modo:

{ 
    "id": 0, 
    "reservations": [ 
     {} 
    ], 
    "name": "string", 
    "dateOfDeparture": "string", 
    "distance": 0, 
    "price": 0, 
    "seats": 0, 
    "from": { 
     "id": 0 
    }, 
    "to": { 
     "id": 0 
    } 
} 

Ma non si può in questo modo:

{ 
    "id": 0, 
    "reservations": [ 
     {} 
    ], 
    "name": "string", 
    "dateOfDeparture": "string", 
    "distance": 0, 
    "price": 0, 
    "seats": 0, 
    "from": 0, 
    "to": 1 
} 
+4

Penso che la seconda parte non sia vera come mostrato dall'altra risposta. – PhoneixS

+0

Sono d'accordo con @Amit khanduri – Johan