परिचय: दो भाई-बहन या फिर कोई बॉस कौन?
\n\nकल्पना कीजिए कि आप एक घर बना रहे हैं। आपके पास बुनियादी उपकरण हैं: हथौड़ा, पेचकस, आरी। यह आपका CrudRepository है — भरोसेमंद, सरल और समझने में आसान। अब कल्पना कीजिए कि इस सेट के साथ आपको प्रोफेशनल इलेक्ट्रिक टूल, लेज़र लेवल और ऑटोमैटिक स्क्रूड्राइवर भी मिलते हैं। यह है JpaRepository — शक्तिशाली, लेकिन सावधानी माँगने वाला।
\n\nStack Overflow पर सवाल "Spring Data JPA में CrudRepository और JpaRepository इंटरफेस में क्या अंतर है?" को हज़ारों व्यूज़ मिलते हैं। और यह कोई संयोग नहीं है। डेवलपर्स (नए और अनुभवी दोनों) अक्सर इन दो इंटरफेस को भ्रमित करते हैं, गलत चुनते हैं और प्रोडक्शन में अनपेक्षित बग्स का सामना करते हैं।
\n\nइस लेख में हम सिर्फ सूखे अंतर नहीं बताएंगे। हम सबसे आम गलतियों पर चर्चा करेंगे जो Java डेवलपर्स CrudRepository और JpaRepository के साथ करते हैं, और दिखाएंगे कि उनसे कैसे बचा जाए। तैयार हैं? चलिए शुरू करते हैं!
CrudRepository और JpaRepository क्या हैं?
\n\nदोनों इंटरफेस Spring Data JPA फ्रेमवर्क का हिस्सा हैं। ये डेटाबेस के साथ काम करने के लिए तैयार मेथड प्रदान करते हैं, जिससे हमें बॉयलरप्लेट कोड लिखने की ज़रूरत नहीं होती। लेकिन इनकी क्षमताएँ और उद्देश्य अलग-अलग हैं।
\n\nCrudRepository: बुनियादी स्तर
\n\nCrudRepository सबसे मौलिक इंटरफेस है। यह मानक CRUD (Create, Read, Update, Delete) ऑपरेशन प्रदान करता है। इसके मुख्य मेथड हैं:
- \n
save(S entity)— एंटिटी को सेव करें \n findById(ID id)— ID से खोजें \n findAll()— सभी रिकॉर्ड प्राप्त करें \n deleteById(ID id)— ID से हटाएँ \n count()— रिकॉर्ड की संख्या \n
यह किसी भी टेबल के लिए बुनियादी फंक्शन का सेट है। यह सार्वभौमिक है और किसी भी प्रकार के स्टोरेज (सिर्फ JPA नहीं) के साथ काम करता है।
\n\nJpaRepository: विस्तृत शस्त्रागार
\n\nJpaRepository, CrudRepository और PagingAndSortingRepository से विरासत प्राप्त करता है। यह JPA-विशिष्ट क्षमताएँ जोड़ता है:
- \n
flush()— डेटाबेस के साथ जबरन सिंक्रोनाइज़ेशन \n saveAndFlush(S entity)— सेव करें और तुरंत डेटाबेस में भेजें \n deleteInBatch(Iterable<T> entities)— बल्क डिलीट (एक SQL क्वेरी में) \n getOne(ID id)— लेज़ी लोडिंग (प्रॉक्सी लौटाता है) \n findAll(Sort sort)— सॉर्टिंग \n findAll(Pageable pageable)— पेजिनेशन \n
यह JPA और Hibernate के साथ काम करने के लिए एक प्रोफेशनल टूल है।
\n\nचुनने और उपयोग करने में शीर्ष 5 गलतियाँ
\n\nअब सबसे दिलचस्प भाग पर आते हैं — वास्तविक गलतियाँ जिनमें डेवलपर्स फँसते हैं।
\n\nगलती 1: जब पेजिनेशन की ज़रूरत हो, CrudRepository का उपयोग करना
\n\nस्थिति: आप यूज़र्स की सूची के लिए API लिख रहे हैं। डेटा बहुत है — पेजिनेटेड आउटपुट चाहिए। आप CrudRepository का उपयोग करते हैं और findAll() और subList() के ज़रिए मैन्युअल रूप से पेजिनेशन लागू करना शुरू करते हैं। यह भयानक, धीमा और असुरक्षित है।
समाधान: अगर आपको पेजिनेशन या सॉर्टिंग चाहिए, तो JpaRepository (या PagingAndSortingRepository) का उपयोग करें।
// ❌ बुरा: CrudRepository + मैन्युअल पेजिनेशन\npublic interface UserRepository extends CrudRepository<User, Long> {\n // पेजिनेशन के लिए कोई मेथड नहीं\n}\n\n// ✅ अच्छा: JpaRepository + बिल्ट-इन पेजिनेशन\npublic interface UserRepository extends JpaRepository<User, Long> {\n Page<User> findAll(Pageable pageable);\n}\n\n// उपयोग\nPage<User> users = userRepository.findAll(PageRequest.of(0, 10, Sort.by("name")));\n\n\n