2010-10-08 13 views
43

मेरे पिछले प्रश्न, DAO and Service layers (JPA/Hibernate + Spring) के बाद, मैंने जेपीए/हाइबरनेट का उपयोग कर एक आवेदन में अपनी डेटा परत (कम से कम शुरुआत में) के लिए केवल एक ही डीएओ का उपयोग करने का निर्णय लिया, वसंत और विकेट। जेनेरिक सीआरयूडी विधियों का उपयोग प्रस्तावित किया गया था, लेकिन मुझे यकीन नहीं है कि जेपीए का उपयोग करके इसे कैसे कार्यान्वित किया जाए। क्या आप कृपया मुझे एक उदाहरण दे सकते हैं या इसके बारे में एक लिंक साझा कर सकते हैं?सिंगल डीएओ और जेनेरिक सीआरयूडी विधियों (जेपीए/हाइबरनेट + स्प्रिंग)

public interface GenericDao<T, PK extends Serializable> { 
    T create(T t); 
    T read(PK id); 
    T update(T t); 
    void delete(T t); 
} 

और एक कार्यान्वयन:

public class GenericDaoJpaImpl<T, PK extends Serializable> 
    implements GenericDao<T, PK> { 

    protected Class<T> entityClass; 

    @PersistenceContext 
    protected EntityManager entityManager; 

    public GenericDaoJpaImpl() { 
     ParameterizedType genericSuperclass = (ParameterizedType) getClass() 
      .getGenericSuperclass(); 
     this.entityClass = (Class<T>) genericSuperclass 
      .getActualTypeArguments()[0]; 
    } 

    @Override 
    public T create(T t) { 
     this.entityManager.persist(t); 
     return t; 
    } 

    @Override 
    public T read(PK id) { 
     return this.entityManager.find(entityClass, id); 
    } 

    @Override 
    public T update(T t) { 
     return this.entityManager.merge(t); 
    } 

    @Override 
    public void delete(T t) { 
     t = this.entityManager.merge(t); 
     this.entityManager.remove(t); 
    } 
} 

उत्तर

84

यहाँ एक उदाहरण इंटरफेस है। यह एक नॉटेशन आधारित जेनेरिक डीएओ फ्रेमवर्क है जो जेपीए और हाइबरनेट

+2

के साथ एकीकरण है कैसे होगा साथ में यह फिट एसएलएसबी और पोजो इकाइयां (डीबी टेबल का प्रतिनिधित्व)? – NimChimpsky

+3

ग्रेट उत्तर। बस कुछ टिप्पणियां: मैं क्लास को कन्स्ट्रक्टर विधि (एक अनचेक कास्ट के बजाए) में पैरामीटर के रूप में पास करता हूं; हटाए गए विधि में पैरामीटर टी को पुन: असाइन नहीं किया जाना चाहिए और कक्षा अधिमानतः सारणी होगी। – megathor

+0

धन्यवाद !!!!!!!! बहुत! – verystrongjoe

5

का समर्थन करता है, मैं वही चीज़ ढूंढ रहा था। मैंने पाया कि वास्तव में क्या लगता है- Spring-Data स्प्रिंगसोर्स द्वारा प्रदान की गई जेपीए परियोजना। यह Hades से एक कोड पोर्ट है और अब (प्रारंभिक 2011) वसंत द्वारा निगल लिया गया है और बेहतर एकीकृत है। यह आपको स्थिर बनावट के साथ एक एकल दाओ (SimpleJpaRepository) का उपयोग करने की अनुमति देता है, या तैयार किए गए सीआरयूडी + विधियों के साथ किसी ऑब्जेक्ट विशिष्ट दाओ को बनाने के लिए आधार जेपीए रिपोजिटरी क्लास का विस्तार करता है। इंटरफ़ेस में विधि के नाम के रूप में पैराम्स नामों का उपयोग करके प्रश्नों जैसे ग्रिल्स को भी अनुमति देता है- कोई कार्यान्वयन आवश्यक नहीं है) यानी findByLastname(String lastName); बहुत ही आशाजनक लग रहा है- स्प्रिंग परियोजनाओं का हिस्सा होने से निश्चित रूप से इसके लिए कुछ भविष्य सुनिश्चित होगा। मैंने अब अपनी आगामी परियोजना में इसे लागू करना शुरू कर दिया है।

14

लेख Don't repeat the DAO हम कई वर्षों के लिए तकनीक के इस प्रकार के लिए इस्तेमाल किया पर आधारित है। हम महसूस करते हैं कि हमने बड़ी गलती की है, हम हमेशा अपने पैटर्न के साथ समस्याओं से जूझ रहे हैं।

एक ओआरएम उपकरण जैसे हाइबरनेट या जेपीए का उपयोग करके आपको डीएओ और सर्विस लेयर को अलग से नहीं सोचना होगा। आप अपनी सेवा कक्षाओं से EntityManager का उपयोग कर सकते हैं क्योंकि आप लेनदेन के जीवन चक्र और वहां अपनी इकाई कक्षाओं के तर्क को जानते हैं।

आप किसी भी क्षण को बचाने अगर आप बस entityManager.saveEntity के बजाय myDao.saveEntity फोन करते हैं? नहीं। आपके पास एक अनावश्यक दाओ वर्ग होगा जो कुछ भी नहीं करता है लेकिन EntityManager के चारों ओर एक रैपर होगा। EntityManager (या हाइबरनेट में सत्र) की सहायता से अपनी सेवा कक्षाओं में चयन लिखने से डरो मत।

एक और टिप्पणी: आप अपने सेवा परत की सीमाओं परिभाषित करना चाहिए और जाने वापसी या इकाई वर्गों के लिए प्रतीक्षा करने के लिए प्रोग्रामर नहीं है। यूआई या डब्ल्यूएस परत प्रोग्रामर को केवल डीटीओ-एस के बारे में इकाई वर्गों के बारे में पता नहीं होना चाहिए। इकाई वस्तुओं में जीवनशैली होती है जो अधिकांश प्रोग्रामर के बारे में नहीं जानते हैं। यदि आप सत्र डेटा में किसी इकाई ऑब्जेक्ट को संग्रहीत करते हैं और इसे डेटाबेस सेकंड या घंटे बाद अपडेट करने का प्रयास करते हैं तो आपके पास वास्तव में गंभीर समस्याएं होंगी। वैसे आप ऐसा नहीं कर सकते हैं लेकिन UI के प्रोग्रामर जो पैरामीटर प्रकार और आपकी सेवा परत के रिटर्न प्रकारों को जानते हैं, केवल कोड की कुछ पंक्तियों को सहेजने के लिए करेंगे।

+0

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

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