नहीं निकलता है मेरे पास जेपीए 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" की जगह। लेकिन यह काम नहीं करता है, पुरानी अवतार छवि लेनदेन प्रतिबद्धता पर डेटाबेस से हटा नहीं है।
क्या कोई जानता है, दूसरा कोड क्यों (अवतार छवि को पहले इसे "शून्य" के बिना सेट किए बिना) काम नहीं करता है?
मैं वास्तव में आपकी सहायता की सराहना करता हूं
बहुत बहुत धन्यवाद!