2012-10-08 8 views
108

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

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

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

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

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

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

+1

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

+1

मैं स्पष्ट रूप से हाइबरनेट के साथ अधिक आरामदायक हूं, लेकिन अगर मैं वही काम कर सकता हूं और अधिक उत्पादक बन सकता हूं, तो मैं नए दृष्टिकोणों को अपनाना चाहता हूं। हालांकि, अगर हाइबरनेट अभी भी अधिक शक्तिशाली है और मुझे बहुत कम समस्याएं आती हैं, तो ऐसा कुछ है जिसे मैं जानना चाहता हूं। – egervari

+2

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

उत्तर

91

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

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

विन्यास वर्ग - एनोटेशन अपने खजाने पैकेज की ओर इशारा करते के साथ अपने अब भी जरूरी एक्सएमएल config इंगित (यह स्वचालित रूप से अब *Impl कक्षाओं के लिए लग रहा है):

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

जेपीए-खजाने .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 - यह तुम कहाँ एनोटेट डाल सकते हैं और unannotated क्वेरी तरीकों।ध्यान दें कि कैसे इस भंडार इंटरफ़ेस फैली 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 वास्तव में एक बड़े आवेदन के लिए तैयार है। और जितना अधिक प्रश्न आप सरल या एनोटेशन में धक्का दे सकते हैं, उतना ही बेहतर आप हैं।

यह सब Spring Data Jpa site पर प्रलेखित है।

शुभकामनाएं।

+4

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

+8

आप अपना खुद का 'जेपीए रिपोजिटरी' -> 'मायजेपा रिपोजिटरी' लागू कर सकते हैं। आपको 'मायजेपा रिपोजिटरी फैक्ट्रीबीन' भी बनाना होगा, लेकिन अगर आप इसे सब सेट करते हैं सही ढंग से ऊपर, आप .sa ओवरराइड कर सकते हैं ve() विधि। यहां वसंत डेटा जेपीए डॉक्स है: http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories न दें अभी तक ऊपर! – sbzoom

+0

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

9

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

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

+2

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

+1

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

2

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

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