2015-04-28 10 views
12

मैं एक पुराने परियोजना है कि मैं वसंत 4 में नवीनीकरण करने के लिए कोशिश कर रहा हूँ है/हाइबरनेट 4.हाइबरनेट 4/वसंत 4 में TransactionProxyFactoryBean का उपयोग कर?

हम अपने लेन-देन को विन्यस्त करने के लिए this दृष्टिकोण का उपयोग करें।

कहना है कि XML में, हम तरह लेन-देन प्रबंधक को परिभाषित:

<bean id="abstractTransactionProxy" 
abstract="true" 
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
<property name="transactionManager" ref="hibernateTransactionManager"/> 
<property name="transactionAttributes"> 
    <props> 
     <prop key="create*">PROPAGATION_REQUIRED</prop> 
     <prop key="update*">PROPAGATION_REQUIRED</prop> 
     <prop key="delete*">PROPAGATION_REQUIRED</prop> 
     <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop> 
    </props> 
</property> 

और

<bean id="MySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource"  ref="myDataSource" /> 
    <property name="configLocation" value="WEB-INF/hibernate.cfg.xml" /> 
</bean> 

और उसके बाद हमारी सेवा सेम से प्रत्येक की तरह परिभाषित कर रहे हैं:

<bean id="customerService" parent="abstractTransactionProxy"> 
    <property name="target" ref="customerTarget"/> 
    <property name="personDAO" ref="personDAO" /> 
</bean> 

और DAOs तरह परिभाषित कर रहे हैं:

public List<Person> getPersonByCriteria(final String criteria) { 
    List<Person> results = 
     (List<Person>) this.getHibernateTemplate().executeFind(new HibernateCallback<List<Person>>(){ 

     public List<Person> doInHibernate(Session session) throws HibernateException, SQLException { 
      List<Person> results = (List<Person>) session.createQuery(MYSQLHERE).setString("criteria", criteria).list(); 
      return results; 
     } 
    }); 
    return results; 
} 

अब, समस्या:

<alias name="personDaoImpl" alias="personDAO"/> 
<bean id="personDaoImpl" 
    class="com.foo.bar.hibernate.PersonDaoImpl"> 
    <property name="sessionFactory" ref="MySessionFactory" /> 
</bean> 

PersonDaoImpl (और अन्य सभी DAOs) कई तरीके है कि इस तरह दिखेगा (DAOs के सभी का विस्तार HibernateDaoSupport) है मैं इस बिंदु पर मुकाबला HibernateDaoSupport से हमारे डीएओ को विस्तारित करने और विस्तार से, इसके हाइबरनेट टेम्पलेट सहायक ऑब्जेक्ट का उपयोग करने पर निर्भरता से छुटकारा पा रहा हूं।

ये कदम उठाएँ मैं ले लिया है या नहीं:

  • सीधे शब्दों में डीएओ तरीकों से उन्हें हटाने -, HibernateDaoSupport विस्तार नहीं HibernateTemplate कॉलबैक को हटा दें। यह लगता है कि:

    public List<Person> getPersonByCriteria(final String criteria) { 
         List<Person> results = (List<Person>) getSessionFactory().getCurrentSession().createQuery(MYSQLHERE).setString("criteria", criteria).list(); 
    
         return results; 
        } 
    
बेशक

इस देता है मुझे संकलन समय त्रुटियों क्योंकि 'getSessionFactory' आधार वर्ग 'HibernateDaoSupport' जो मैं सिर्फ हटाया का हिस्सा था।

  • तो मैं एक 'MyHibernateDaoSupport' क्लास लागू किया, और मेरी डीएओ कि बजाय का विस्तार किया था। ऐसा लग रहा है:

    public class MyHibernateDaoSupport { 
    
        private SessionFactory sessionFactory; 
        protected Session session; 
        protected static Logger logger = Logger.getLogger(MyHibernateDaoSupport.class); 
    
        public void setSessionFactory(SessionFactory sessionFactory) { 
         this.sessionFactory = sessionFactory; 
         session = this.sessionFactory.getCurrentSession(); 
        } 
    
        public SessionFactory getSessionFactory() { 
        return this.sessionFactory; 
        } 
    
        public Session getHibernateTemplate() { 
         session = this.sessionFactory.getCurrentSession(); 
         return session; 
        } 
    
        public MyHibernateDaoSupport() { 
        } 
    

    }

अब मैं, निर्माण कर सकते हैं तैनाती और चलाने के लिए और मैं यह त्रुटि संदेश मारा:

No session available in this thread 

मैं कैसे यह काम कर सकते हैं?

  • सरल शब्दों में, 'hibernateCallback()' क्या था, और यह anoymous भीतरी वर्ग वास्तव में कर रहा है?

  • मैं अपने प्रोजेक्ट का लेनदेन, पहले की तरह काम HibernateDaoSupport और HibernateTemplate कक्षाओं का उपयोग किए बिना कर सकते हैं?

मैं के साथ मेरी 'customerservice' (व्यापार तर्क उद्देश्य यह है कि 'PersonDao' कॉल) टैगिंग की कोशिश की है @transactional लेकिन (ए) मैं एक ही त्रुटि परवाह किए बिना और (बी) मैं वास्तव में पसंद करते हैं को देखने के कोड को अब काम करने के तरीके में परिवर्तन के पैमाने को कम करने के लिए, प्रोग्रामेटिक रूप से ऐसा करने में सक्षम होने के लिए। मैंने लेनदेन को इसके बजाय डीएओ स्तर पर डालने की कोशिश की, और एक ही मुद्दे से मुलाकात की।

क्षमा करें अगर यह स्टैक ओवरफ़्लो प्रारूप के लिए बहुत अधिक जानकारी थी।

उत्तर

1
  1. आप अपने डीएओ वर्गों में SessionFactory इंजेक्षन करने की जरूरत है:

    @Repository 
    public class PersonDAOImpl implements PersonDAO { 
    
        @Autowired 
        private SessionFactory sessionFactory; 
    
        public List<Person> getPersonByCriteria(final String criteria) { 
         List<Person> results = (List<Person>) getSessionFactory().getCurrentSession().createQuery(MYSQLHERE).setString("criteria", criteria).list(); 
         return results; 
        } 
    } 
    
  2. आपकी सेवा तरीकों के @Transactional जोड़े

  3. कथात्मक लेनदेन उपयोग करने के लिए जोड़े HibernateTransactionManager

  4. आज्ञा स्प्रिंग :

    <tx:annotation-driven transaction-manager="transactionManager"/> 
    
  5. सुनिश्चित करें कि आप SessionFactory

बनाने के लिए LocalSessionFactoryBean का उपयोग करते हैं यहाँ एक विस्तृत चरण-दर-चरण tutorial for configuring Spring and Hibernate 4

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