2010-07-12 15 views
12

मैं एक अपवाद कह रही:स्प्रिंग 3 एनोटेशन - HibernateDaoSupport - भंडार आवश्यक सत्र फैक्टरी

java.lang.IllegalArgumentException: 'sessionFactory' या 'hibernateTemplate' आवश्यक है

जब HibernateDaoSupport क्लास पर @Repository एनोटेशन का उपयोग करने का प्रयास कर रहा है। रिपोजिटरी बनाने के लिए त्रुटि संदेश सीधा है, इसे एक सत्र फैक्टरी की आवश्यकता है। हालांकि, मैं अपने XML में एक सत्र कारखाने को परिभाषित किया है:

<!-- Hibernate --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dashDataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>com.mycomp.myapp.Category</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      </props> 
     </property> 
    </bean> 

तो मुझे यकीन है कि कैसे भंडार SessionFactory देने के लिए है कि यह आवश्यकता है, जबकि यह यह एनोटेशन प्रेरित सेम है बनाने नहीं हूँ, मैं निम्न कार्य करने का प्रयास किया:

@Autowired 
    protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) { 
     return super.createHibernateTemplate(sessionFactory); 
    } 

लेकिन क्योंकि भंडार है कि संपत्ति है, जबकि instantiating बस नहीं है जब एक क्रिया करने की जरूरत है इस समस्या की संभावना का समाधान नहीं करता। दुर्भाग्यवश, मुझे नहीं पता कि इस समस्या को कैसे हल किया जाए क्योंकि @Autowired एनोटेशन के साथ ओवरराइड करने के लिए कोई कन्स्ट्रक्टर या प्रारंभिक विधियां नहीं हैं।

मैंने यह सुनिश्चित करने के लिए जांच की है कि सत्र फैक्ट्री बीन बनाया जा रहा है और इसे स्वचालित किया जा सकता है, और यह ठीक है।

+3

आप अब Hibernatetemplate का उपयोग नहीं करना चाहेंगे क्योंकि यह अधिक लाभ प्रदान नहीं करता है http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor- jpatemplate/ – vsingh

उत्तर

36

HibernateDaoSupportsetSessionFactory() के माध्यम से SessionFactory साथ आपूर्ति की है। हालांकि, setSessionFactory()final है, इसलिए आप इसे @Autowired एनोटेशन जोड़ने के लिए ओवरराइड नहीं कर सकते हैं। लेकिन आप इसे से मनमाने ढंग से विधि के लिए @Autowired आवेदन कर सकते हैं और फोन setSessionFactory():

@Autowired 
public void init(SessionFactory factory) { 
    setSessionFactory(factory); 
} 
+1

भयानक, धन्यवाद! मैंने पहले से ही सत्र कारखाने का उपयोग करने के मार्ग को नीचे जाना शुरू कर दिया है, लेकिन लेनदेन खोलने के लिए संघर्ष कर रहा था, मुझे लगता है कि मैं सिर्फ डीएओएसपोर्ट के साथ जाऊंगा, क्योंकि यह मेरे सरल उद्देश्यों के लिए बहुत अच्छा काम करता है। – walnutmon

+0

अच्छा, यह बहुत अच्छी तरह से काम करता है! टिप @axtavt के लिए धन्यवाद। –

6

तुम भी परिभाषित कर सकते हैं जो सत्र कारखाने आप (यदि आप एक से अधिक है, उदाहरण के लिए) का उपयोग करना चाहते, @Qualifier एनोटेशन का उपयोग करके :

@Autowired 
public MyClassImpl(@Qualifier("myOtherSessionFactory") SessionFactory sessionFactory) { 
    setSessionFactory(sessionFactory); 
} 

तुम भी AbstractRoutingDataSource का विस्तार करके डेटा स्रोतों के बीच टॉगल कर सकते हैं। this page देखें।

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