स्प्रिंग डेटा जेपीए बड़ी परियोजनाओं के लिए हाइबरनेट से कैसे भिन्न होता है?


129

मुझे यह तय करने में एक कठिन समय मिल रहा है कि क्या मुझे नई परियोजना के लिए हाइबरनेट के साथ रहना चाहिए, या अपने पैरों को जेपीए और नए स्प्रिंग डेटा कार्यान्वयन के साथ गीला कर देना चाहिए।

क्या स्प्रिंग डेटा फ्रेमवर्क बड़ी परियोजनाओं या मामूली क्वेरी आवश्यकताओं वाली छोटी परियोजनाओं के लिए है?

जबकि मैं निश्चित रूप से @Queryएनोटेशन का उपयोग करके कोड कमी में लाभ देखता हूं , आप गतिशील प्रश्नों के लिए क्या करते हैं? जब आप एक बचत () विधि को लागू करना चाहते हैं, जो काफी जटिल है तो क्या होगा?

प्रलेखन एक कस्टम इंटरफ़ेस और कार्यान्वयन बनाने के लिए कहता है कि आपका मुख्य भंडार लागू होता है, लेकिन क्या होगा यदि आपको क्रूड रिपॉजिटरी पर किसी भी सुपर तरीकों को एक्सेस करने की आवश्यकता है? क्रूड रिपॉजिटरी कस्टम एक को लागू करता है - चारों ओर दूसरा तरीका नहीं। यह एक अजीब डिजाइन की तरह लगता है।

मैं बहुत अनिश्चित हूं कि क्या यह ढांचा जटिल और बड़े अनुप्रयोगों की चुनौतियों का सामना करेगा। मैंने कभी भी हाइबरनेट के साथ कई समस्याओं में भाग नहीं लिया है, और मैं स्प्रिंग डेटा जेपीए के साथ जाने के बजाय अच्छे पुराने विश्वसनीय के साथ चिपके रहने पर विचार कर रहा हूं।

मुझे क्या करना चाहिए? यदि मैं स्प्रिंग डेटा JPA के साथ जाता हूं तो क्या अप्रत्याशित जटिलताओं और लागतों का सामना करना पड़ेगा?


1
जहां तक ​​मुझे पता है, इससे बहुत फर्क पड़ता है। उस व्यक्ति के साथ जाएं, जिसके साथ आप अधिक सहज हैं। क्यों हुई बहस?
duffymo

1
मैं स्पष्ट रूप से हाइबरनेट के साथ अधिक सहज हूं, लेकिन अगर मैं समान चीजें कर सकता हूं और अधिक उत्पादक हो सकता हूं, तो मैं नए दृष्टिकोणों को अपनाना चाहूंगा। हालांकि, अगर हाइबरनेट अभी भी अधिक शक्तिशाली है और मैं बहुत कम समस्याओं का सामना करूंगा, तो यह एक ऐसी चीज है जिसके बारे में मैं जानना चाहता हूं।
२०:

3
JPA ORM का एक सामान्यीकरण है जो हाइबरनेट को कई कार्यान्वयनों में से एक के रूप में उपयोग करता है। एक के बाद एक आप किन शक्तियों के लिए जिम्मेदार हैं? जेपीए एक मानक है, लेकिन मैं दोनों के बीच बहुत कम अंतर देखता हूं। पूर्ण प्रकटीकरण के हित में, मैं कहूंगा कि मुझे किसी की परवाह नहीं है। दोनों आपके लिए SQL उत्पन्न करते हैं। मैं इसे स्वयं लिखूंगा। ORM प्रत्येक समस्या और प्रत्येक उपयोगकर्ता के लिए नहीं है।
duffymo

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

3
"स्प्रिंग डेटा" जेपीए, या कुछ भी का कार्यान्वयन नहीं है। यह बस एक मौजूदा जेपीए कार्यान्वयन लेता है और आपके द्वारा इसे प्रदान करने के लिए सरल करता है। जेपीए कार्यान्वयन अभी भी सभी कामों को कवर के तहत करता है
नील स्टॉकटन

जवाबों:


104

तो, spring-dataकुछ अतिरिक्त जादू करता है जो जटिल प्रश्नों के साथ मदद करता है। यह पहली बार में अजीब है और आप इसे डॉक्स में पूरी तरह से छोड़ देते हैं लेकिन यह वास्तव में शक्तिशाली और उपयोगी है।

इसमें एक रिवाज Repositoryऔर एक कस्टम `रिपोजिटरीइम्प्ल 'बनाने और स्प्रिंग को यह बताने के लिए कि इसमें कहां शामिल है। यहाँ एक उदाहरण है:

कॉन्फ़िगरेशन क्लास - आपके रिपॉजिटरी पैकेज की ओर इशारा करते हुए एनोटेशन के साथ आपके अभी-भी-ज़रूरी xml कॉन्फिगरेशन की ओर इशारा करता है (यह *Implअब उन कक्षाओं के लिए दिखता है :

@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}

jpa-repositories.xml - बताएं Springकि आपकी रिपॉजिटरी कहां मिलेगी। फ़ाइल नाम के Springसाथ कस्टम रिपॉजिटरी देखने के लिए भी कहें CustomImpl:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />

</beans>

MyObjectRepository- यह वह जगह है जहाँ आप एनोटेट और अननोनोटेड क्वेरी मेथड डाल सकते हैं। ध्यान दें कि यह रिपॉजिटरी इंटरफ़ेस किस तरह का विस्तार करता Customहै:

@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {

    List<MyObject> findByName(String name);

    @Query("select * from my_object where name = ?0 or middle_name = ?0")
    List<MyObject> findByFirstNameOrMiddleName(String name);
}

MyObjectRepositoryCustom - रिपॉजिटरी विधियाँ जो अधिक जटिल हैं और एक सरल क्वेरी या एनोटेशन के साथ नियंत्रित नहीं की जा सकती हैं:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl- जहां आप वास्तव में उन तरीकों को एक स्वत EntityManager: लागू करते हैं :

public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    public final List<MyObject> findByNameWithWeirdOrdering(String name) {
        Query query = query(where("name").is(name));
        query.sort().on("whatever", Order.ASC);
        return entityManager.find(query, MyObject.class);
    }
}

आश्चर्यजनक रूप से, यह सब एक साथ आता है और दोनों इंटरफेस (और CRUD इंटरफ़ेस, जिसे आप लागू करते हैं) से विधियाँ दिखाई देती हैं:

myObjectRepository.

तुम देखोगे:

myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()

यह वास्तव में काम करता है। और आपको क्वेरी करने के लिए एक इंटरफ़ेस मिलता है। spring-dataवास्तव में एक बड़े अनुप्रयोग के लिए तैयार है। और जितने अधिक प्रश्न आप सरल या एनोटेशन में कर सकते हैं, उतने ही बेहतर हैं।

यह सब स्प्रिंग डेटा जपा साइट पर प्रलेखित है ।

सौभाग्य।


4
यह वास्तव में है जो मैंने कोशिश की, और यह कुछ हद तक काम करता है। मेरे पास समस्या यह है कि यदि आप सेव () को ओवरराइड करना चाहते हैं तो क्या होगा? उदाहरण के लिए, कल्पना करें कि आप एक ब्लॉग को सहेज रहे हैं, और आप इसे सेवा में डालने से बचाने के लिए इससे जुड़े टैग को संसाधित / सहेजना चाहते हैं क्योंकि इसे किसी सेवा में लगाने से कोई मतलब नहीं है। यह कच्चे हाइबरनेट के साथ करना आसान है, लेकिन मुझे स्प्रिंग जेपीए के साथ एक अच्छा तरीका नहीं दिखता है। मैं आपके उत्तर को सही के रूप में चिह्नित करने जा रहा हूं क्योंकि यह सही है। यह मूल रूप से आप स्प्रिंग डेटा जेपीए के साथ क्या कर सकते हैं। मुझे लगता है कि मैं हालांकि हाइबरनेट के साथ रहूंगा। यह उत्तर निश्चित रूप से दूसरों की मदद करेगा।
अहंकारी

8
आप अपना खुद का JpaRepository-> लागू कर सकते हैं MyJpaRepository। आपको भी बनाना होगा, MyJpaRepositoryFactoryBeanलेकिन यदि आप इसे सही तरीके से सेट करते हैं, तो आप .save () विधि को ओवरराइड कर सकते हैं। यहाँ स्प्रिंग डेटा जेपीए डॉक्स है: static.springsource.org/spring-data/data-jpa/docs/current/… अभी तक हार मत मानो !
सब्ज़ूम

@Picrochole आप 'आवेदन के निचले स्तर' की व्याख्या कैसे करते हैं? क्या सेवा, जो टियर में डीएओ को कम कहती है?
रुमिड

12

मैंने सरल क्वेरी मांगों के साथ छोटी और बड़ी परियोजनाओं में स्प्रिंग डेटा जेपीए का उपयोग किया है। मुख्य लाभ @Queryएनोटेशन का उपयोग नहीं करने से भी है । स्प्रिंग डेटा में कुछ भी नहीं है जो आपको बड़ी परियोजनाओं में इसका उपयोग करने से रोकता है और हालिया QueryDSLसमर्थन आपकी मदद कर सकता है। यह हाइबरनेट को लक्षित करने के लिए QueryDSL का उपयोग करने का एक उदाहरण है ।

यदि आप जटिल प्रश्नों का पूर्वाभास करते हैं और आप जेपीए के बिना हाइबरनेट वस्तुओं का उपयोग करने में सहज महसूस करते हैं, तो मुझे लगता है कि वैकल्पिक Repositoryहाइबरनेट-आधारित लोगों के बगल में सरल स्प्रिंग डेटा के लिए एक वैकल्पिक संयोजन हो सकता है जिसकी आपको विशिष्ट विधियों की आवश्यकता हो सकती है। यह कम बोझिल हो सकता है जो स्प्रिंग डेटा जेपीए संरचना में हाइबरनेट कार्यान्वयन को घुमा दे।


2
मुझे लगता है कि मैं एक ही परियोजना में मिश्रण और मिलान के बजाय प्रश्नों के लिए एक ही संगत एपीआई का उपयोग करूंगा। मुझे अभी भी जटिल स्प्रिंग डेटा जेपीए सामान के लिए एक अच्छा समाधान नहीं मिला है, और चूंकि जेपा के साथ काफी कुछ नाइटपिक्स हैं जो मेरे पास सामान्य रूप से हैं, मुझे लगता है कि मुझे अपने ऑर्मा के रूप में हाइबरनेट स्वीकार करने में खुशी हो सकती है। मेरे पास बहुत सारे जटिल प्रश्न होंगे, और मैं 40/60 के मिश्रण को बर्दाश्त नहीं कर सकता। यह मेरे लिए इसके लायक नहीं है :(
इर्वेटरी

1
आप बिना स्प्रिंग डेटा के भी सीधे Querydsl का उपयोग कर सकते हैं जो आपको JPA के शीर्ष पर एक शक्तिशाली क्वेरी परत देता है।
टिमो वेस्टकम्प्टर

4

स्प्रिंग जेपीए आपको एसक्यूएल और यहां तक ​​कि कुछ एचक्यूएल को क्वेरी विधि घोषणा का उपयोग करने से बहुत अधिक अमूर्तता प्रदान करेगा। स्प्रिंग जेपीए अपनी क्वेरी पीढ़ी के साथ चमकता है लेकिन जब आप एक शुद्ध हाइबरनेट समाधान चाहते हैं तो आप आवश्यकतानुसार अनुकूलित कर सकते हैं क्योंकि स्प्रिंग जेपीए अभी भी हाइबरनेट पर आधारित है। अधिक जानकारी के लिए डॉक्स http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.