1.1 समस्या की पृष्ठभूमि

जब आप वास्तविक डेटाबेस के साथ काम करना शुरू करते हैं, तो आपको तुरंत "समयपूर्व अनुकूलन सभी बुराई की जड़ है" वाक्यांश याद होगा। केवल अब आप उसे नकारात्मक तरीके से याद करते हैं। डेटाबेस के साथ काम करते समय, अनुकूलन अपरिहार्य है। और आपको इसके साथ पहले से ही डिजाइन चरण में काम करने की आवश्यकता है।

हाइबरनेट डेटाबेस के साथ काम करना बहुत सुविधाजनक बनाता है। आप आसानी से किसी भी बच्चे की वस्तुओं को ठीक से एनोटेट करके आसानी से प्राप्त कर सकते @OneToManyहैं @ManyToMany। उदाहरण:


@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;
 
   @OneToMany(cascade = CascadeType.ALL)
   @JoinColumn(name = "user_id")
   public List<Comment> comments;
}

और उपयोगकर्ता की टिप्पणियां प्राप्त करना कितना आसान है:


User user = session.get(User.class, 1);
List<Comment> comments = user.getComments();

और आप एक बड़े आश्चर्य में पड़ जाएंगे। यूजर के पास कई हजार कमेंट्स हैं। यदि आप इस तरह कोड लिखते हैं, तो निश्चित रूप से हाइबरनेट उपयोगकर्ता की सभी टिप्पणियों को लोड करेगा। लेकिन यह बहुत धीमा होगा, टिप्पणियाँ बहुत अधिक मेमोरी वगैरह ले लेंगी।

इसलिए आप ऐसा नहीं लिख सकते! सिद्धांत रूप में, हाँ, लेकिन व्यवहार में, नहीं।

1.2 संग्रह के साथ चीजों को और खराब करना

समस्या तो और भी दिलचस्प है। आखिरकार, आमतौर पर आपको सभी उपयोगकर्ता टिप्पणियों की आवश्यकता नहीं होती है। भले ही आप उन्हें क्लाइंट पर कहीं प्रदर्शित करते हैं, आप इसे भागों - पृष्ठों में करना पसंद करते हैं।

तो आपको इस तरह के तरीकों की जरूरत है:


public class CommentsManager {
    private static final PAGE_SIZE = 50;
 
    public List<Comment> getCommentsPage(int userId, int pageIndex){
     	User user = session.get(User.class, userId);
     	List<Comment> comments = user.getComments();
     	return comments.subList(pageIndex * PAGE_SIZE, PAGE_SIZE);
    }
 
   public int getCommentsPageCount(int userId)   {
     	User user = session.get(User.class, userId);
     	List<Comment> comments = user.getComments();
     	return Math.ceil(  comments.size()/PAGE_SIZE);
   }
 
}

पहली विधि टिप्पणियों का केवल एक पृष्ठ लौटाती है - 50 टुकड़े। दूसरी विधि टिप्पणियों के पृष्ठों की संख्या लौटाती है। और यह सबसे खराब है। केवल टिप्पणियों की संख्या का पता लगाने के लिए, आपको डेटाबेस से सभी टिप्पणियों को डाउनलोड करना होगा!

1.3 सुरंग के अंत में प्रकाश

इसलिए, कोई भी हमारे अद्भुत बाल संग्रहों का उपयोग नहीं करता है। नहीं, बेशक उनका उपयोग किया जाता है, लेकिन केवल एचक्यूएल प्रश्नों के हिस्से के रूप में। उदाहरण के लिए इस तरह:


public class CommentsManager {
      private static final PAGE_SIZE = 50;
 
       public List<Comment> getCommentsPage(int userId, int pageIndex){
           	String hql = "select comments from User where id = :id";
           	Query<Comment> query = session.createQuery( hql, Comment.class);
           	query.setParametr("id", userId);
           	query.setOffset(pageIndex * PAGE_SIZE);
           	query.setLimit(PAGE_SIZE);
           	return query.list();
      }
 
      public int getCommentsPageCount(int userId)   {
           	String hql = "select count(comments) from User where id = :id";
           	Query<Integer> query = session.createQuery( hql, Integer.class);
           	query.setParametr("id", userId);
           	return Math.ceil(query.singleResult()/PAGE_SIZE);
     }
 
}

अच्छी खबर यह है कि हम अपने तरीकों को इस तरह लागू कर सकते हैं कि हमें डेटाबेस से अतिरिक्त डेटा लोड करने की आवश्यकता नहीं है। बुरी खबर यह है कि हमारे संग्रहों के साथ काम करना आसान नहीं है।