2011-09-22 13 views
7

मेरा प्रश्न जेपीए 2.0 के बारे में हैबर्ननेट, @OneToOne रिश्तों और आलसी लोडिंग के साथ है।जेपीए 2.0/हाइबरनेट: LAZY "@OneToOne" के साथ बॉक्स के बाहर क्यों काम करता है?

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

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

मैं हाल ही में इस तथ्य से आया हूं कि एक @OneToOne रिश्ते को आलसी तरीके (FetchType.LAZY) नहीं लाया जा सकता है, कम से कम बाइट कोड उपकरण के बिना नहीं एन, समय बुनाई या पसंद संकलित करें। वहाँ कई साइटों यह कहते हैं, उदाहरण के लिए:

बात मेरी सेटअप के साथ, एक @OneToOne इकाई का एक आलसी लोड हो रहा है काम करने के लिए लगता है "बॉक्स से बाहर", और मैं वास्तव में समझना चाहता हूं क्यों।

@Test 
@Transactional 
public void testAvatarImageLazyFetching() 
{ 
    User user = new User(); 
    user.setAvatarImage(new AvatarImage()); 

    User = userRepository.save(user); 

    entityManager.flush(); 
    entityManager.clear(); 

    User loadedUser = userRepository.findOne(user.getId()); 
    assertNotNull(loadedUser); 

    PersistenceUtil persistenceUtil = Persistence.getPersistenceUtil(); 

    assertTrue(persistenceUtil.isLoaded(loadedUser)); 
    assertFalse(persistenceUtil.isLoaded(loadedUser, "avatarImage")); 
} 

इस परीक्षण का मामला सफल होता है, और Hibernates एसक्यूएल लॉगिंग उत्पादन में, मैं स्पष्ट रूप से देख सकते हैं, कि "avatarImage" प्राप्त नहीं किया जा जाएगा, बस "उपयोगकर्ता": कृपया, मेरी इकाई परीक्षण पर एक नजर है (सिर्फ एक का चयन करें, कोई शामिल हों, "AvatarImage" तालिका आदि के लिए पहुँच नहीं)

उपयोगकर्ता कक्षा में दिशाहीन @OneToOne relationshop इस तरह दिखता है:

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private AvatarImage avatarImage; 

तो, सब कुछ बहुत ही सरल - और ऐसा लगता है कि काम करता है।

मेरा प्रश्न दोहराने के लिए: यह क्यों काम कर रहा है, "अवतार छवि" को आलसी क्यों लाया जा सकता है, हालांकि इसे @OneToOne एसोसिएशन के साथ संदर्भित किया गया है?

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

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

उत्तर

8

OneToOne रिश्ते की आलसी लोडिंग के साथ समस्या केवल इसके विपरीत भाग पर है (जिसे मैप किए गए गुण के साथ चिह्नित किया गया है)। यह रिश्ते के स्वामित्व वाले पक्ष पर ठीक काम करता है। टी वह उन लोगों के बीच अंतर डेटाबेस स्तर पर स्पष्ट है। आपके मामले में सवाल यह है कि यदि उपयोगकर्ता डेटाबेस तालिका में अवतार इमेज की एक आईडी कॉलम या दूसरी तरफ गोल के रूप में होती है। यदि उपयोगकर्ता तालिका में अवतार इमेज की एक आईडी वाला कॉलम है तो आलसी लोडिंग काम करेगी जैसा आपने कहा था "आउट ऑफ़ बॉक्स" लेकिन यह दूसरे तरीके से काम नहीं करेगा।

3

हाइबरनेट जेपीए प्रदाता के साथ @OneToOne एनोटेटेड रिश्ते के लिए आलसी रिचिंग बॉक्स से बाहर काम करता है, जब बाइटकोड वाद्ययंत्र के कुछ रूपों का प्रदर्शन किया जाता है। आपके मामले में, हम बिल्ड-टाइम वाद्ययंत्र को रद्द कर सकते हैं (आपकी टिप्पणी से यह बताता है कि यह आउट ऑफ़ द बॉक्स)। यह आपको रनटाइम बुनाई की संभावना के साथ छोड़ देता है, जो हाइबरनेट & वसंत में काफी संभव है। हाल ही में हाइबरनेट के रिलीज में, जैविसिस्ट को सीजीएलबीबी (which has been deprecated since Hibernate 3.5.5) के दूसरे विकल्प के विपरीत, हाइबरनेट के लिए रनटाइम बाइटकोड इंस्ट्रूमेंटेशन फ्रेमवर्क के रूप में उपयोग किया जाता है।

वसंत में जावस्सिस्ट सक्षम है या नहीं, इसका सवाल जवाब देने के लिए काफी आसान है। हाइबरनेट एंटिटी मैनेजर (जो जेपीए 2.0 प्रदाता है जो हाइबरनेट कोर को प्रतिनिधि करता है) के लिए जवासिस्ट की आवश्यकता होती है, और इसलिए, इसे कक्षाओं के रनटाइम बुनाई के लिए हाइबरनेट के वर्गपाथ में होना चाहिए।आप ब्रेकपॉइंट (अपने एप्लिकेशन सर्वर से जुड़े रिमोट डीबगर में) सेट करके इसकी पुष्टि कर सकते हैं, और आप देखेंगे कि User कक्षा का एक हाइबरनेट प्रबंधित उदाहरण AvatarImage उदाहरण का संदर्भ नहीं रखेगा; इसके बजाय इसमें <package_name>.AvatarImage_$$_javassist_0 जैसे नाम के साथ एक उन्नत कक्षा का संदर्भ होगा (जो प्रॉक्सी है जो आलसी fetching के लिए अनुमति देता है)।

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