2015-11-02 10 views
6

साथ नेस्ट वस्तु के बिना मैं एक परियोजना जो वस्तुओं में से कुछ ORM मानचित्रण के साथ संबंधित है (वहाँ कुछ @OneToMany संबंधों आदि कर रहे हैं)।स्प्रिंग बूट जेपीए - JSON OneToMany संबंध

मैं इन वस्तुओं और वसंत जेपीए को एपीआई में प्रबंधित करने के लिए आरईएसटी इंटरफ़ेस का उपयोग कर रहा हूं।

यह मेरा POJOs में से एक का एक उदाहरण है:

@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; 
} 

जब एक अनुरोध करने वाले, मैं JSON में सब कुछ स्पष्ट करना पड़ता:

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

मैं क्या पसंद करते हैं, वास्तव में निर्दिष्ट करने है संदर्भित वस्तु की आईडी उनके पूरे निकायों की बजाय,

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

क्या यह भी possi है ble? क्या कोई मुझे यह करने के बारे में कुछ अंतर्दृष्टि दे सकता है? मैं केवल विपरीत करने के लिए ट्यूटोरियल ढूंढ रहा हूं (मेरे पास पहले से मौजूद समाधान)।

+0

आप पा कोशिश कर सकते हैं इस उपयोगी - http://wiki.fasterxml.com/JacksonFeatureObjectIdentity – VadymVL

उत्तर

14

हाँ, यह संभव है।

इस उद्देश्य आप अपनी इकाई मॉडल के लिए जैक्सन एनोटेशन की जोड़ी का उपयोग करना चाहिए के लिए:

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

आपका धारावाहिक JSON इस के बजाय दिखेगा:

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

इस तरह:

{ 
    "from": 3 
} 

official documentation में उल्लेख किया है:

@JsonIdentityReference - वैकल्पिक एनोटेशन कि वस्तुओं के लिए एक संदर्भ के अनुरूपण जानकारी के लिए इस्तेमाल किया जा सकता है जिसके लिए " पहचान वस्तु" सक्षम है (JsonIdentityInfo देखें)

alwaysAsId = true इंगित करने के लिए कि क्या सभी संदर्भित मार्कर के रूप में इस्तेमाल किया मूल्यों को ids (सत्य) के रूप में क्रमबद्ध किया जाना है;

नोट है कि अगर 'सही' का मान प्रयोग किया जाता है, अक्रमांकन एक कस्टम आईडी समाधानकर्ता का उपयोग करके अतिरिक्त प्रासंगिक जानकारी की आवश्यकता हो सकती है, और संभवतः - डिफ़ॉल्ट से निपटने के लिए पर्याप्त नहीं हो सकता है।

+0

से सहमत हूं यह वास्तव में सहायक था, धन्यवाद! – Jerry

+0

@JsonIdentityInfo यहाँ जरूरी है? – kiedysktos

+0

@kiedysktos हां। – VadymVL

1

आप @JsonIgnore एनोटेशन का उपयोग करके केवल अपनी JSON सामग्री को अनदेखा कर सकते हैं। क्षेत्र है जो तुम वहाँ पर अपने JSON में छुपाना चाहते हैं आप टिप्पणी कर सकते हैं कि साथ @JsonIgnore। आप इस तरह अपने JSON बदल सकते हैं:

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

लेकिन आप इस तरह नहीं कर सकते हैं:

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

मुझे लगता है कि दूसरे भाग अन्य जवाब से शो के रूप में सही नहीं है। – PhoneixS

+0

मैं @Amit khanduri – Johan

संबंधित मुद्दे