2011-12-19 13 views
8

मैं जिस पर लगभग सभी संबंधों निम्नलिखित एनोटेशन हैं एक कोड बेस विरासत में मिला हैजेपीए का कैस्केड = रिमूव और हाइबरनेट का @ ओनडेलेट एक साथ उपयोग किया जाता है?

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "someThing") 
@OnDelete(action = OnDeleteAction.CASCADE) 

अब मैं आ रही परेशानी को समझ कर @OnDelete पहली जगह में है। Hibernate: OnDelete vs cascade=CascadeType.REMOVE दिलचस्प है, लेकिन दुर्भाग्य से कोई जवाब नहीं है और @OnDelete के लिए जावाडॉक विशेष रूप से बेकार है।

अन्य प्रश्नों से यह ऑनडेलेट एनोटेशन की तरह दिखता है किसी भी तरह से डीबी को कैस्केडिंग करने देता है, जबकि @OneToMany पर कैस्केडिंग निर्देश दें, ओआरएम इसे करते हैं, लेकिन इनका उपयोग करने का उद्देश्य कभी भी क्या होगा?

और @OneToMany का कैस्केड निर्देश वास्तव में ओआरएम कार्यान्वयन को डीबी आधारित कैस्केड उत्पन्न करने की अनुमति नहीं देता है?

उत्तर

8

मान लीजिए कि आप एक एक-से-एक दिशात्मक संबंध

class House { 

    @OneToOne 
    Object door; 

} 

है आप CascadeType.REMOVE तो घर को हटाने से दरवाजा को नष्ट करेगा का उपयोग करते हैं करते हैं।

@OneToOne(cascade=CascadeType.REMOVE) 
    Object door; 

यदि आप @OnDelete का उपयोग करते हैं तो दरवाजा हटाने से घर भी हट जाएगा।

@OneToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    Object door; 

और पढ़ें यहाँ: http://www.ninthavenue.com.au/jpa-cascadetype-remove-vs-hibernate-ondelete

+2

साथ व्यवहार एक '@ OneToOne' और एक' @ OneToMany' काफी एक ही होना प्रतीत नहीं होता है। '@OneToMany (...) @OnDelete (action = OnDeleteAction.CASCADE) ऑब्जेक्ट दरवाजे' के साथ, ऐसा लगता है कि घर को हटाने से उसके सभी दरवाजे हटा दिए जाते हैं, लेकिन दरवाजा हटाना घर को नहीं हटाता है। – Bruno

+0

मुझे लगता है कि, @OneToMany List दरवाजे 'होना चाहिए, मुझे लगता है। लेकिन इसके अलावा, यह मैपिंग आम तौर पर हाउस टेबल पर एक कॉलम नहीं बनायेगी। आप या तो 'Doors.house', या एक संग्रह तालिका पर एक रिवर्स मैपिंग होगा। डेटाबेस कैस्केडिंग के लिए, मुझे लगता है कि कॉलम उस टेबल में होना चाहिए जिसमें आप कैस्केड करना चाहते हैं। –

+0

असहमत। मुझे लगता है कि उपयोगकर्ता के विचार में '' 'CascadeType.REMOVE''' और' '@DDelete''' के बीच सबसे बड़ा अंतर यह है कि' @ 'ऑनडेले'' 'जेपीएक्यूएल के साथ काम कर सकता है (क्योंकि यह डीबी कैस्केड पर आधारित है), लेकिन '' CascadeType.REMOVE'' 'JPAQL के साथ काम नहीं कर सकता है। – okwap

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