2012-02-28 13 views
5

द्वारा ऑब्जेक्ट हटाएं ऑब्जेक्ट को हटाने के लिए सबसे अच्छी विधि (प्रदर्शन के अनुसार) कौन सा आईडी उपलब्ध है।हाइबरनेट आईडी

  1. एचक्यूएल। इस HQL को निष्पादित करेगा सत्र Context ऑब्जेक्ट हाइबरनेट दृढ़ता संदर्भ में लोड?

    for(int i=0; i<listOfIds.size(); i++){ 
        Query q = createQuery("delete from session_context where id = :id "); 
         q.setLong("id", id); 
         q.executeUpdate(); 
    } 
    
  2. आईडी द्वारा लोड और हटाएं।

    for(int i=0; i<listOfIds.size(); i++){ 
        SessionContext session_context = (SessionContext)getHibernateTemplate().load(SessionContext.class, listOfIds.get(i)); 
        getHibernateTemplate().delete(session_context) ; 
    } 
    

यहाँ SessionContext वस्तु तालिका session_context को मैप किया है। या, अच्छी तरह से पाठ्यक्रम सभी एक साथ अलग और बेहतर दृष्टिकोण है?

उत्तर

7

दो में से पहला, बेहतर है, जहां आप स्मृति को सहेज लेंगे। जब आप इकाई को हटाना चाहते हैं और आपके पास आईडी है, तो एचक्यूएल लिखना पसंद किया जाता है।

आप में मामला एक तिहाई और बेहतर विकल्प नहीं है,

नीचे की कोशिश करो,

//constructs the list of ids using String buffer, by iterating the List. 
String idList = "1,2,3,....." 

Query q = createQuery("delete from session_context where id in (:idList) "); 
q.setString("idList", idList); 
q.executeUpdate(); 

अब अगर वहाँ में केवल एक क्वेरी के सक्रिय होने का में 4 आइटम हैं, इससे पहले नहीं होगा 4.

नोट: - उपरोक्त काम करने के लिए, session_context एक स्वतंत्र तालिका होना चाहिए।

+0

धन्यवाद, कुछ चिंताएं 1. मेरी आईडीलिस्ट के पास किसी दिए गए समय में लगभग 1000 आईडी हो सकती हैं। क्या यह एक मुद्दा होगा? 2. डिलीट करने पर यह पहली बार सभी सत्र कॉन्टेक्स्ट ऑब्जेक्ट्स को हटाने के संदर्भ में दृढ़ता संदर्भ में लोड करने का प्रयास करेगा और फिर हटाने के लिए आगे बढ़ेगा? – mohit052

+0

किसी ऑब्जेक्ट को हटाने के लिए, आपको उन्हें सत्र में लोड करने की आवश्यकता नहीं है। इसे 1000 वस्तुओं के साथ भी काम करना चाहिए, लेकिन पहले इसे काम करना चाहिए, फिर प्रदर्शन में सुधार करें। – ManuPK

+0

धन्यवाद। इसे मिला :- डी – mohit052

2

आपको कैशिंग - प्रथम स्तर (सत्र) और द्वितीय स्तर के कैश पर भी विचार करना चाहिए।

पहला विकल्प शायद सबसे अच्छा है अगर डिलीट लेनदेन में एकमात्र या पहला ऑपरेशन है।

यदि आप कुछ सत्र कॉन्टेक्स्ट ऑब्जेक्ट्स के लिए पूछते हैं तो एचक्यूएल को हटाने के लिए कॉल करें, फिर क्वेरी कैश में सभी ऑब्जेक्ट्स को निकाल दिया जाएगा, क्योंकि हाइबरनेट को यह नहीं पता कि कौन से हटाना है। यह दूसरे दृष्टिकोण के साथ मामला नहीं है।

यदि आप दूसरे स्तर के कैश का उपयोग करते हैं तो यह और भी जटिल है और आप सत्र कॉन्टेक्स्ट ऑब्जेक्ट्स के साथ जो भी करते हैं उस पर अत्यधिक निर्भर करता है।

+1

कृपया ** कैशिंग ** यहां न आएं, ** ओपी ** बस बैकिंग टेबल से प्रविष्टियों को हटाना चाहते हैं, न कि कैश से। जैसा कि आपने ** द्वितीय स्तर के कैश को बताया था, यह और भी जटिल है ** यदि संभव हो तो बेहतर न जाएं! – ManuPK

+0

कोई दूसरा स्तर कैशिंग यहां :-)। धन्यवाद चीजों को मंजूरी दे दी। – mohit052

3

Btw, कि बदसूरत स्ट्रिंग के लिए कोई कहते हैं, वहाँ .setParameterList() है, इसलिए:

List<Long> idList = Arrays.asList(1L, 2L, 3L); 

Query q = createQuery("delete from session_context where id in (:idList) "); 
q.setParameterList("idList", idList); 
q.executeUpdate(); 

अद्यतन मैं इस पर अद्यतन करना होगा, हमारे वातावरण में, अंत में यह पता चला है, कि सेट पैरामीटर लिस्ट का उपयोग करके स्ट्रिंग मैनुअल बनाने और @ManuPK जैसे setString का उपयोग करने से सुझाव दिया जाता है।

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