2009-05-07 9 views
14

का उपयोग क्यों करें मैं एक शुद्ध जेपीए एपीआई कार्यान्वयन का उपयोग करने के लिए हाइबरनेट एपीआई का उपयोग करने से अपनी डीएओ परत को बदलने की प्रक्रिया में हूं। ऐसा लगता है कि इकाई प्रबंधक से createNamedQuery का उपयोग करने के लिए अनुशंसित विधि है। नामित प्रश्न मॉडल/इकाई वर्गों में एनोटेशन में संग्रहीत होते हैं। यह सिर्फ मुझे समझ में नहीं आता है। आप मॉडल ऑब्जेक्ट्स में जेपीए क्वेरीज़ को परिभाषित क्यों करेंगे लेकिन डीएओ में उनका इस्तेमाल करेंगे। क्या डीएओ के भीतर से केवल createQuery का उपयोग करने और डीएओ में प्रश्नों को परिभाषित करने के लिए और डीएओ में नामित प्रश्नों को परिभाषित करने के लिए और अधिक समझदारी नहीं होगी?जेपीए createNamedQuery

आप में से उन लोगों के लिए जिन्होंने जेपीए एपीआई का उपयोग करके अपनी डीएओ परत लागू की है, आपने अपने प्रश्नों को कैसे परिभाषित किया है?

उत्तर

12

मैं नामित प्रश्नों का उपयोग करता हूं।

वहाँ ऐसा करने के लिए दो कारण हैं:

  1. यह उन्हें एक और अधिक केंद्रीय स्थान यादृच्छिक createQuery (साथ कोड में बिखरे हुए बजाय में डालता है) कहता है; और
  2. बिल्ड प्रक्रियाएं क्वेरी (वास्तव में उपयोगी) को मान्य कर सकती हैं।
+7

केंद्रीय स्थान मॉडल ऑब्जेक्ट को डीएओ बनाम क्यों उपयोग करना चाहिए जो वास्तव में इसका उपयोग कर रहा है? – Ruggs

+2

मैं यह उल्लेख करना भूल गया कि इन नामित प्रश्नों को मैं आम तौर पर इकाई पर डालता हूं। यदि क्वेरी कई संस्थाओं को पार करती है तो आप केवल सबसे प्रासंगिक चुनते हैं। – cletus

6

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

यदि आप डीएओ (पुन: उपयोग और स्थिरता के लिए) में कम या ज्यादा परिष्कृत आधारभूत संरचना का उपयोग करते हैं तो नामित प्रश्नों का उपयोग प्रस्ताव के लिए कोई स्पष्ट लाभ के साथ कार्यान्वयन और पठनीयता दोनों को जटिल नहीं करता है।

निर्माण प्रक्रिया द्वारा प्रश्नों की पुष्टि करना दिलचस्प लगता है - मैं और जानना चाहता हूं कि इसका वास्तव में क्या अर्थ है ... मेरे प्रश्न त्रुटियों के लिए थोड़ा मार्जिन छोड़ते हैं क्योंकि प्रत्येक डीएओ विधि इकाई जितनी समझ में आता है उतना परीक्षण किया जाता है।

+1

मैं उन्हें अजीब भी ढूंढ रहा हूं इसलिए मैं प्रश्नों का प्रस्ताव दे रहा हूं। प्रश्नों के लिए एक केंद्रीय स्थान रखने के लिए रखरखाव के लिए समझदारी होती है हालांकि मुझे नहीं पता कि उन्हें मॉडल ऑब्जेक्ट में डालने से क्या समझ में आता है। अगर मैं डीएओ बनाए रखता हूं तो मैं पहले डीएओ विधि पर जाता हूं जिसे अद्यतन करने की आवश्यकता होती है, अब मुझे क्वेरी को देखने के लिए मॉडल ऑब्जेक्ट पर जाना होगा। – Ruggs

+0

सत्यापन वास्तव में काफी अच्छा है। मैं अपने विकास के लिए ग्रहण का उपयोग करता हूं और जब मैंने कुछ प्रश्नों को लिखा, तो मैंने एएस कीवर्ड बंद कर दिया और मुझे निर्माण के दौरान त्रुटियां मिलीं। – Ruggs

+0

मुझे यह जोड़ना चाहिए कि मैं सामान्य रूप से उन्हें छोटे प्रश्नों के लिए उपयोग नहीं करता (उदाहरण के लिए "पार्टी पी से नाम पी जहां नाम = नाम"), बस अधिक जटिल प्रश्न हैं। – cletus

2

हर जगह नामित प्रश्नों का उपयोग न करें, ऐसे मामले हैं जहां वे उचित नहीं हैं, जैसे कि जब कभी शायद ही कभी प्रश्नों का उपयोग किया जाता है तो यह आवश्यक आधार पर बनाया जाने पर अधिक कुशल हो सकता है।

नामित प्रश्न अधिक जटिल होते हैं जब यह जटिल होगा और अक्सर निष्पादित किया जाएगा।

[Updated]

आप, मानचित्रण में नामित प्रश्नों लिख सकते हैं बजाय।

+0

निष्पादित क्वेरी की आवृत्ति क्यों नामित क्वेरी होने के लिए इसे बेहतर उम्मीदवार बनाती है। – Ruggs

+0

नामित प्रश्नों को एक बार पार्स किया जाता है और हमेशा के लिए उपयोग किया जाता है। इसलिए, अगर हम गलत प्रश्न लिखते हैं तो यह तुरंत अपवाद फेंकता है। आपके द्वारा कोड में बनाए गए प्रश्नों को कैश किए जाने तक हर समय पार्स किया जाता है। –

+0

वैसे, दिया गया लिंक वही सुझाता है। http://www.oracle.com/technology/products/ias/toplink/doc/1013/main/_html/qryun008.htm –

10

आप Spring Data JPA पर एक नज़र डाल सकते हैं। यह आपको निष्पादन को मैन्युअल रूप से कार्यान्वित करने की आवश्यकता के बिना इंटरफ़ेस को परिभाषित करने और क्वेरी निष्पादित करने की अनुमति देता है।

निकाय:

@Entity 
@NamedQuery(id="User.findByLastname" query="from User u where u.lastname = ?1") 
public class User implements Persistable<Long> { 

    @Id 
    private Long id; 
    private String username; 
    private String lastname; 
    private int age; 
} 

भंडार:

public interface UserRepository extends CrudRepository<User, Long> { 

    // Will trigger the NamedQuery due to a naming convention 
    List<User> findByLastname(String lastname); 

    // Will create a query from the methodname 
    // from User u where u.username = ? 
    User findByUsername(String username); 

    // Uses query annotated to the finder method in case you 
    // don't want to pollute entity with query info 
    @Query("from User u where u.age > ?1") 
    List<User> findByAgeGreaterThan(int age); 
} 

सेटअप:

EntityManager em = Persistence.getEntityManagerFactory().createEntityManager(); 
JpaRepositoryFactory factory = new JpaRepositoryFactory(em); 

UserRepository repository = factory.getRepository(UserRepository.class); 

जैसा कि आप देख आप क्वेरी प्राप्त करने के लिए अलग अलग तरीकों से विधि से निष्पादित करने के लिए बीच चयन कर सकते ।इसे विधि नाम से सीधे प्राप्त करने के दौरान सरल प्रश्नों के लिए व्यवहार्य है जो आप शायद @NamedQuery (जेपीए मानक) या @Query (स्प्रिंग डेटा जेपीए एनोटेशन) के बीच चुनते हैं, इस पर निर्भर करते हुए कि आप मानकों के साथ कितना चिपकना पसंद करते हैं।

वसंत डेटा जेपीए आपको डेटा एक्सेस लेयर कार्यान्वयन के विभिन्न अन्य कोनों में समर्थन देता है, जो तरीकों के लिए कस्टम कार्यान्वयन प्रदान करता है और अच्छी तरह से वसंत के साथ एकीकृत करता है।

+0

प्रश्न जेपीए समाधानों के बारे में है, न कि दृढ़ता API का उपयोग करने के लिए। –

+3

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

+1

मुझे लगता है कि ओलिवर का जवाब और तर्क अच्छी तरह से उचित है। मैं व्यक्तिगत रूप से सोचता हूं कि हेड्स का उनका उदाहरण बहुत दिलचस्प है और सवाल का जवाब देता है। दरअसल, मुझे लगता है कि ढांचे पर मुझे गहरी नज़र होगी ... :) –

2

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