2016-01-17 7 views
10

अपने प्रोजेक्ट में मैं प्रकार एक जो OneToMany संबंध नहीं की वस्तु का उपयोग करें (orphanRemoval = सच है, झरना = CascadeType.ALL, लाने = FetchType.EAGER) प्रकार की वस्तुओं के लिए बी। मुझे एक पूर्ण PO12 अनुरोध का उपयोग कर बी ऑब्जेक्ट्स (बच्चों) के साथ पूर्ण पूर्ण ऑब्जेक्ट को स्टोर करने के लिए SpringDataRest (SDR) की आवश्यकता है। मैं एसडीआर, केवल एक है जो मेरे लिए काम किया में कई संयोजनों की कोशिश की, के रूप में निर्यात = false वस्तु के लिए @RepositoryRestResource बनाने के लिए एक और वस्तु बी के लिए @RepositoryRestResource बनाने के लिए है, लेकिन निशान इस (बी) था (अगर मैं वस्तु बी सब से बाहर भंडार का निर्माण नहीं किया, यह काम नहीं होगा -> बस एक वस्तु एकल पोस्ट अनुरोध पर संग्रहीत किया जाएगा, लेकिन नहीं अपने बच्चों (@OneToMany संबंध) प्रकार बी की; एक ही परिणाम तब होता है जब निर्यात किया गया = झूठा बी भंडार के लिए छोड़ा गया है)। क्या यह ठीक है और इसे कैसे प्राप्त किया जा सकता है (एक ही समय में सभी वस्तुओं को संग्रहीत करने के साथ एकल POST अनुरोध)?संशोधित @OneToMany इकाई

कारण मैं पूछ रहा हूं, मेरे पिछले उदाहरण में, मुझे के भंडार का उपयोग करके सभी वस्तुओं "जीवन चक्र" को नियंत्रित करना है। मैं इसके साथ ठीक हूँ, क्योंकि एक ->बी संबंध संरचना (बीएक के बाहर मौजूद नहीं है) है। लेकिन मुझे अपने पेरेंट रिपोजिटरी का उपयोग करके एसडीआर द्वारा बी के एक निश्चित ऑब्जेक्ट को संपादित करने (भी हटाने) की गंभीर समस्या है (क्योंकि ऑब्जेक्ट बी का अपना खुद का भंडार निर्यात नहीं किया गया है)। शायद, परिभाषा से यह संभव नहीं है। (": मिलता है, DELETE की अनुमति दें" हेडर में है) -> हां, तो भी -> विधि की अनुमति नहीं के लिए "/ ए/1/बी/2" काम नहीं करता है

  • PATCH: मैं इन समाधानों की कोशिश की है PUT प्रश्न
  • जेसन पैच या तो काम नहीं करेगा - जेसन पैच सामग्री-प्रकार [{"op": "add", "path": "/ B/2" का उपयोग करके "/ ए/1" के लिए पैच , ....}] -> "लक्ष्य सरणी में ऐसी कोई अनुक्रमणिका " - क्योंकि जेसन पैच "सरणी" के बाद इसके सरणी के सूचकांक के रूप में स्केलर "2" का उपयोग करता है। यह जावा दुनिया में व्यावहारिक नहीं है, जब वस्तुओं के सेट में संबंध रखा जाता है - अनुक्रमण का कोई अर्थ नहीं है बिल्कुल। (निर्यात = true)
  • मैं भंडार का निर्यात कर सकता है वस्तु बी की के लिए यह "सीधे" जोड़ तोड़, लेकिन मैं दुकान पूरी वस्तु अपने बी के साथ एक करने की क्षमता खो जाएगा इस तरह से वस्तुओं एक एकल में पोस्ट अनुरोध जैसा कि मैंने पहले उल्लेख किया है।

मैं PUT के लिए अपने बी वस्तु में से एक एकल छोटे संशोधन के साथ पूरे एक वस्तु भेजने से बचने का, यदि संभव हो तो करना चाहते हैं। धन्यवाद।

उत्तर

4

मैं इस प्रकार बाल इकाई को बदलने में कामयाब रहा।एक नमूना के रूप में मैं निम्नलिखित संस्थाओं का इस्तेमाल किया:

@Entity 
@Data 
@NoArgsConstructor 
public class One { 

    @Id 
    @GeneratedValue 
    private Long id; 

    private String name; 

    @OneToMany(cascade = ALL) 
    private List<Many> manies = new ArrayList<>(); 

} 

@Entity 
@Data 
@NoArgsConstructor 
public class Many { 

    public Many(String name) { 
     this.name = name; 
    } 

    @Id 
    @GeneratedValue 
    private Long id; 

    private String name; 
} 

मैं सिर्फ One उजागर के लिए भंडार है।

का उपयोग कर json पैच

यह उदाहरण manies सूची में दूसरे मद निकाल देंगे एक आइटम निकाला जा रहा (मेरे उदाहरण उत्कृष्ट httpie - CLI HTTP client उपयोग करें)। आप यह सुनिश्चित करने के लिए @ ऑर्डर कॉलम का उपयोग कर सकते हैं कि आप सूची आइटम के क्रम पर भरोसा कर सकते हैं।

echo '[{"op":"remove", "path":"/manies/1"}]' | http PATCH :8080/ones/1 Content-Type:application/json-patch+json -v 

PATCH /ones/1 HTTP/1.1 
Content-Type: application/json-patch+json 

[ 
    { 
     "op": "remove", 
     "path": "/manies/1" 
    } 
] 

json पैच का उपयोग कर पूरी सूची की जगह

यह नमूना सरणी मान में निर्दिष्ट के साथ इस सूची बदल देता है।

echo '[{"op":"add", "path":"/manies", "value":[{"name":"3"}]}]' | http PATCH :8080/ones/1 Content-Type:application/json-patch+json -v 

PATCH /ones/1 HTTP/1.1 
Accept: application/json 
Content-Type: application/json-patch+json 

[ 
    { 
     "op": "add", 
     "path": "/manies", 
     "value": [ 
      { 
       "name": "3" 
      } 
     ] 
    } 
] 

json पैच का उपयोग कर किसी आइटम को सूची जोड़ना

यह नमूना एक सूची के अंत में एक आइटम कहते हैं। इसके अलावा क्लाइंट को अद्यतन से पहले सूची की लंबाई जानने की जरूरत है। तो आदेश वास्तव में यहां कोई फर्क नहीं पड़ता।

echo '[{"op":"add", "path":"/manies/-", "value":{"name":"4"}}]' | http PATCH :8080/ones/1 Content-Type:application/json-patch+json -v 

PATCH /ones/1 HTTP/1.1 
Accept: application/json 
Content-Type: application/json-patch+json 

[ 
    { 
     "op": "add", 
     "path": "/manies/-", 
     "value": { 
      "name": "4" 
     } 
    } 
] 

उम्मीद है कि इससे मदद मिलती है।

+0

आपकी व्यापक पोस्ट के लिए, माथीस, बहुत बहुत धन्यवाद। मेरी समस्या यह है कि, जैसा कि मैंने उल्लेख किया है, कि मैं सेट्स का उपयोग करता हूं और सूची नहीं देता (@ ऑर्डर कॉलम सेट के साथ काम नहीं करता है)। मुझे आपको एक व्यक्तिगत प्रश्न पूछने दो: क्या आपको नहीं लगता कि वास्तविक इकाई के "आईडी" के बजाय "इंडेक्स" का उपयोग करना आसान आराम क्वेरी के साथ "अजीब" समाधान है? मुझे पता है, यह जेसनपैच के मुख्य उद्देश्य (जेसन को संशोधित करने के लिए) के साथ आता है ... लेकिन वैसे भी, मैं उत्सुक हूं, अगर यह अलग-अलग तरीके से किया जा सकता है। – rotmajster

+0

मैं सूची में कोई आइटम जोड़ने के लिए अपना समाधान आज़मा रहा हूं और मुझे कई त्रुटियां मिल रही हैं: '' op ":" add "," path ":"/manies/- "," value ": {" name " : "4"} एक ऐसी सूची में जिसमें कोई प्रविष्टियां नहीं हैं, मुझे 'osesSpelEvalaluException: EL1004E: विधि कॉल: विधि आकार() एक प्रकार पर नहीं पाया जा सकता है, इसलिए मैंने '/ manies' का उपयोग करने का प्रयास किया, जिसने मुझे' संगठन 'दिया .springframework.data.rest.webmvc.json.patch.PatchException: क्लास org.hibernate.collection.internal में {"name": "4"} नहीं पढ़ सका। पार्सिस्टेंटबैग! 'कोई विचार? – joshwa

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