2011-09-22 13 views
15

नहीं निकलता है मेरे पास जेपीए 2.0, हाइबरनेट और "अनाथ रिमूवल" के बारे में प्रश्न है।जेपीए 2.0/हाइबरनेट और "अनाथ रिमूवल": बस एक इकाई को प्रतिस्थापित करने से पुराना एक

सबसे पहले मेरी स्थापना:

  • स्प्रिंग 3.0.5.RELEASE
  • SprnigData जेपीए 1.0.1.RELEASE
  • हाइबरनेट 3.5.2-फाइनल
  • डीबीएमएस: PostgreSQL 9,0

मेरे पास दो अपेक्षाकृत सरल इकाई वर्ग हैं, "उपयोगकर्ता" और "अवतार छवि", ए "उपयोगकर्ता" में "अवतार छवि" है, और इसलिए "उपयोगकर्ता" और "अवतार छवि" के बीच संबंध है ionship।

वर्ग "उपयोगकर्ता" में, संपत्ति इस तरह दिखता है:

// class "User" 
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true) 
private AvatarImage avatarImage; 

तो इसका मतलब है कि, "avatarImage" संपत्ति अशक्त करने के लिए सेट हो जाता है, "उपयोगकर्ता" और "AvatarImage" के बीच संदर्भ है हटा दिया गया और "अनाथ रिमूवल" तंत्र डेटाबेस से "अवतार छवि" को हटा देगा (अगर मैं गलत हूं तो कृपया मुझे सही करें)।

user.setAvatarImage(null); // First set it to null 
userRepository.save(user); // Now "orphanRemoval" will delete the old one 

user.setAvatarImage(theNewAvatarImage); 
userRepository.save(user); 

तो, अशक्त करने के लिए "avatarImage" संपत्ति की स्थापना पहले "उपयोगकर्ता" बचत, और उसके बाद:

तो जब मैं एक निश्चित उपयोगकर्ता के लिए "avatarImage" अद्यतन करते हैं, मैं इस समय इस बारे में करने के लिए है नया अवतार छवि "theNewAvatarImage" सेट करें, फिर उपयोगकर्ता को सहेज लें।

यह एकमात्र तरीका है जो वर्तमान में मेरे लिए काम करता है - "अनाथ रिमूवल" पुरानी "अवतार छवि" को "शून्य" पर सेट करने और फिर उपयोगकर्ता को सहेजने पर हटा देगा।

लेकिन, मुझे सोचा होगा कि इस कोड को भी काम करना चाहिए:

user.setAvatarImage(theNewAvatarImage); 
userRepository.save(user); 

तो मैं "avatarImage" सेटिंग छोड़ "अशक्त" लेकिन सिर्फ "theNewAvatarImage" की स्थापना, पुराने "avatarImage" की जगह। लेकिन यह काम नहीं करता है, पुरानी अवतार छवि लेनदेन प्रतिबद्धता पर डेटाबेस से हटा नहीं है।

क्या कोई जानता है, दूसरा कोड क्यों (अवतार छवि को पहले इसे "शून्य" के बिना सेट किए बिना) काम नहीं करता है?

मैं वास्तव में आपकी सहायता की सराहना करता हूं

बहुत बहुत धन्यवाद!

उत्तर

12

यह हाइबरनेट जेआईआरए टिकट HHH-5559 और HHH-6484 से संबंधित है। बड़े पैमाने पर, हाइबरनेट, आज के रूप में, आपको रिश्तों को नया मूल्य प्रदान करने से पहले निरंतर संदर्भ को सेट करने और दृढ़ता संदर्भ को फ्लश करने की आवश्यकता है (एचएचएच -6484 में परीक्षण केस देखें); यह केवल ऐसे मामले में है कि हाइबरनेट orphanRemoval के लिए टूटा कार्यान्वयन (IMHO) प्रदान करते हुए SQL DELETE कथन जारी करता है।

संक्षेप में, आपको बग को ठीक करने के लिए इंतजार करना होगा, या संदर्भ को निरस्त करने के लिए कोड लिखना होगा और दृढ़ता संदर्भ को फ्लश करना होगा, या इस तरह से orphanRemoval का समर्थन करने वाले जेपीए प्रदाता का उपयोग करें (ग्रहण लिंक 2.3.0 करता है) ।

1

@OneToMany रिश्ते के रूप में, यह हाइबरनेट जेआईआरए टिकट HHH-6709 से संबंधित है। कृपया इनके लिए वोट दें ताकि इसे कुछ ध्यान मिले।

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