2011-11-22 14 views
5

का उपयोग कर स्प्रिंग हाइबरनेट के साथ कम डीएओ लिखें मेरी स्प्रिंग + हाइबरनेट कॉन्फ़िगरेशन फ़ाइलें छोटी और सुपर तंग हैं। मैं अपने मॉडल इकाइयों/दास खोजने के लिए ऑटो स्कैनिंग का उपयोग करता हूं।एनोटेशन

मैं अपने पदानुक्रम में प्रत्येक इकाई के लिए एक डीएओ + डीएओआईआईएमएल लिखना नहीं चाहता हूं।

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

क्या डिफैक्टो मानक को रोकने के लिए कोई रास्ता है?

कहो, एक सामान्य डीएओ, पूर्व की तरह कुछ:

http://www.ibm.com/developerworks/java/library/j-genericdao/index.html

तो मैं क्या कर सकते हैं

GenericDao dao = appContext.getBean("genericDao"); 
    dao.save(car);    
    dao.save(lease); 

की तरह कुछ एनोटेशन के साथ यह संभव है? मैं xml में कुछ भी कॉन्फ़िगर नहीं करना चाहता हूं।

@Repository("carDao") 
@Repository("leaseDao") 
class GenericDaoImpl extends CustomHibernateDaoSupport implements GenericDao { 
... 
} 

और फिर

GenericDao dao = appContext.getBean("carDao"); 
    dao.save(car);    
    dao = appContext.getBean("leaseDao"); //carDao is garbage coll. 
    dao.save(lease); 

बिल्कुल यह व्यावहारिक है: मैं ऊपर नहीं कर सकते हैं, तो यह अभी भी संभव तरह कुछ के साथ एक GenericDaoImpl.java है?

उत्तर

5

जेनरिक का उपयोग करके आप कुछ इस तरह की कोशिश कर सकते:

@Repository 
@Transactional 
public class GenericDAOImpl<T> implements GenericDAO<T> { 

    @Autowired 
    private SessionFactory factory; 

    public void persist(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.persist(entity); 
    } 

    @SuppressWarnings("unchecked") 
    public T merge(T entity) { 
     Session session = factory.getCurrentSession(); 
     return (T) session.merge(entity); 
    } 

    public void saveOrUpdate(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.saveOrUpdate(entity); 
    } 

    public void delete(T entity) { 
     Session session = factory.getCurrentSession(); 
     session.delete(entity); 
    } 

} 

सामग्री अलग हो सकता है, लेकिन सामान्य विचार लागू है।

फिर आप

@Autowired 
private GenericDAO<Car> carDao; 
+0

मुझे यह विचार पसंद है, लेकिन क्या यह काम करता है? मैं प्रकार विलोपन डुप्लिकेट सेम परिभाषा करने के लिए नेतृत्व करेंगे उम्मीद होती है, जांच न की हो इस हालांकि ... – seanhodges

+1

आसपास सर्च कर रहे हैं, ऐसा लगता है आप के आसपास विलोपन का उपयोग कर उप इंटरफेस काम कर सकते हैं लग रहा है: http: // stackoverflow।कॉम/प्रश्न/5029 9 4/वसंत-आईओसी-और-जेनेरिक-इंटरफ़ेस-प्रकार – seanhodges

+0

बस स्पष्ट करने के लिए, सत्र फैक्ट्री पर स्वचालित रूप से स्प्रिंग में हाइबरनेट के सत्र फैक्ट्री को स्वचालित कर देगा, है ना? लेकिन क्या होगा यदि मेरा CustomHibernateDaoSupport org.springframework.orm.hibernate3.support.HibernateDaoSupport को एक स्वचालित विधि के साथ विस्तारित करता है जो setSessionFactory (sessionFactory) को कॉल करता है। तो डिफ़ॉल्ट रूप से अन्य दाओ के सत्र स्वचालित रूप से स्प्रिंग द्वारा प्रबंधित किए जाने के लिए कॉन्फ़िगर किए जाते हैं ... क्या इन एकाधिक "सत्र" प्रदर्शन के मुद्दों को लागू करेंगे? – sloven

2

का उपयोग करके अपने नियंत्रक और सेवा की कक्षाओं में डीएओ autowire को आप Spring/Hibernate with JPA है, जो बुनियादी हठ कार्यों की एक बड़ी राशि के लिए EntityManager प्रदान करता गठजोड़ कर सकते हैं सक्षम होना चाहिए:

@Service 
public class CarService { 

    @PersistenceContext 
    private EntityManager em; 

    public void saveCarAndLease(Car car, Lease lease) { 
     em.persist(car); 
     em.persist(lease); 
    } 
} 

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

कुछ ट्यूटोरियल सुझाव देते हैं कि आपको अभी भी जेपीए प्लंबिंग के अमूर्तकरण के लिए डीएओ लिखना चाहिए। हालांकि, मैं व्यक्तिगत रूप से इस अनावश्यक पाया है (जेपीए एक बहुत छोटे से एकीकरण पदचिह्न है), और वास्तव में यह भी जिस तरह से पर्दे के पीछे डेटा परत के साथ Spring Roo सौदों है।

1

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