2010-05-19 13 views
9

यह एक बहुत ही सरल सवाल की तरह लगता है, लेकिन मुझे अभी तक एक निश्चित उत्तर नहीं मिला है। मेरे पास एक डीएओ कक्षा है, जो मानदंड प्रश्नों का उपयोग करके स्वाभाविक रूप से डेटाबेस से पूछताछ कर रही है। इसलिए मैं जानना चाहता हूं कि अलग-अलग प्रश्नों के निर्माण के लिए एक ही मानदंड बिल्डर कार्यान्वयन का उपयोग करना सुरक्षित है या क्या मुझे प्रत्येक क्वेरी के लिए नया मानदंडबिल्डर उदाहरण बनाना है। निम्नलिखित कोड उदाहरण को स्पष्ट करना चाहिए कि मैं क्या करना चाहता हूं:क्या एकाधिक मानदंड बनाने के लिए एक ही मानदंडबिल्डर (जेपीए 2) उदाहरण का उपयोग किया जा सकता है?

public class DAO() { 
    CriteriaBuilder cb = null; 

    public DAO() { 
     cb = getEntityManager().getCriteriaBuilder(); 
    } 

    public List<String> getNames() { 
     CriteriaQuery<String> nameSearch = cb.createQuery(String.class); 
     ... 
    } 

    public List<Address> getAddresses(String name) { 
     CriteriaQuery<Address> nameSearch = cb.createQuery(Address.class); 
     ... 
    } 
} 

क्या यह ठीक है?

उत्तर

6

गारंटी नहीं दे सकते खंड में जावाडोक 3.1.1 EntityManager जेपीए 2.0 विनिर्देश के इंटरफ़ेस (JSR 317) पढ़ना:

/** 
* Return an instance of CriteriaBuilder for the creation of 
* CriteriaQuery objects. 
* @return CriteriaBuilder instance 
* @throws IllegalStateException if the entity manager has 
*   been closed 
*/ 
public CriteriaBuilder getCriteriaBuilder(); 

और इस टिप्पणी के तुरंत बाद:

Query, TypedQuery, CriteriaBuilder, Metamodel, और EntityTransaction ऑब्जेक्ट मैनेजर से प्राप्त किए गए ऑब्जेक्ट मान्य हैं जबकि इकाई प्रबंधक खुला है।

और अनुभाग 6.5 निर्माण मानदंड क्वेरीज़

CriteriaBuilder इंटरफ़ेस CriteriaQuery वस्तुओं का निर्माण करने के लिए प्रयोग किया जाता है। CriteriaBuilder कार्यान्वयन EntityManager या EntityManagerFactory इंटरफ़ेस का getCriteriaBuilder विधि के माध्यम से पहुँचा है।

मैं इकाई प्रबंधक के जीवनकाल के लिए कई प्रश्न बनाने के लिए एक CriteriaBuilder का पुन: उपयोग करने में सक्षम होने की उम्मीद करता हूं। लेकिन यह मेरी व्याख्या है। हालांकि, मेरा प्रारंभिक परीक्षण यह पुष्टि करने लगता है कि इसमें कुछ भी गलत नहीं है (इसके विपरीत वास्तव में भयानक होगा)।

+0

धन्यवाद पास्कल। आपकी व्याख्या ठोस लगता है। इसने मेरी बहुत मदद की। – pkainulainen

1

दिलचस्प सवाल। मैं कहूंगा "निश्चित रूप से, यह मानदंडों का पूरा बिंदु है", लेकिन मुझे इसे वापस करने के लिए एक भी शब्द नहीं मिला: http://java.sun.com/javaee/6/docs/tutorial/doc/gjivm.html

हालांकि: अगर वे पुन: प्रयोज्य नहीं थे, तो इसका अर्थ यह होगा कि वास्तव में इकाई प्रबंधक उन्हें संशोधित करता है, जो भयानक एपीआई डिजाइन होगा। तो: मुझे आशा है कि वे reuseable हैं, लेकिन मैं इसे

1

यह सुरक्षित है।

आप EntityManagerFactory से मानदंडबिल्डर प्राप्त कर सकते हैं। हाइबरनेट कार्यान्वयन में, मानदंडबिल्डर EntityManagerFactory का एक उदाहरण का क्षेत्र है। तो पारंपरिक मामलों में, कोई जोखिम नहीं है।

1

ग्रहण लिंक एक यादृच्छिक फैशन में त्रुटियों (EclipseLink-6089, org.eclipse.persistence.exceptions.QueryException) (कुछ समय यह काम करता है, कुछ समय नहीं) जब आप कोई क्वेरी शुरू करते हैं, तो आप से पहले एक दूसरे से पहले निष्पादित उत्पन्न करता है। विवरण के लिए Stack Overflow और JBoss issues देखें।

यदि आप अपने प्रश्न एक-एक करके चलाते हैं या यदि आप हाइबरनेट का उपयोग करने की योजना बनाते हैं तो मानदंडबिल्डर का पुन: उपयोग करने में कोई समस्या नहीं है।

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