2012-09-09 6 views
33

मित्र के साथ आवेदन का विकास, लेकिन एक सवाल में भाग ... मैं इस कोड था:HibernateTransactionManager या JpaTransactionManager

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 

<tx:annotation-driven /> 
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

और वह यह सब हटा दिया, करने के लिए इसे बदल दिया है:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="persistenceUnit"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

उन्होंने कहा, यह बेहतर दृष्टिकोण है, लेकिन बिल्कुल स्पष्ट क्यों नहीं किया। सीधे हाइबरनेट का उपयोग न करने के बारे में कुछ, क्या इसका मतलब यह है कि हम अब हाइबरनेट का उपयोग नहीं कर रहे हैं? क्या यह वास्तव में बेहतर दृष्टिकोण है?

डीएओ इस तरह बदल दिया है:

मैं था:

@Autowired 
private SessionFactory sessionFactory; 

public void addUser(User user) { 
    sessionFactory.getCurrentSession().save(user); 
} 

अब है:

@PersistenceContext 
private EntityManager entityManager; 

public void addUser(User user) { 
    entityManager.persist(user); 
} 
+0

मेरे पास यह अतिरिक्त प्रश्न भी है: यदि मैं जेपीए तरीके कॉन्फ़िगरेशन का उपयोग करता हूं, तो क्या कोई अंतर है यदि मैं हाइबरनेट 3.X निर्भरता या हाइबरनेट 4.X का उपयोग करता हूं? – grep

उत्तर

43

वह हाइबरनेट के बजाय अपने कोड जेपीए पर निर्भर होना चाहता है। javax.persistence.EntityManager एक जेपीए (जावा ईई) मानक इंटरफ़ेस है, जबकि org.hibernate.SessionFactory एक हाइबरनेट गुणधारा इंटरफ़ेस है। सत्र कारखाने से EntityManager में जाने से आपकी कक्षाएं अब हाइबरनेट पर निर्भर नहीं होती हैं। हाइबरनेट-मार्ग के बजाय जेपीए-मार्ग का उपयोग आज अधिकांश लोगों द्वारा सर्वोत्तम अभ्यास माना जाता है।

कृपया ध्यान दें कि आपका सिस्टम अभी भी हाइबरनेट पर निर्भर है, क्योंकि आपको जेपीए प्रदाता की आवश्यकता है। लेकिन यदि आप भविष्य में किसी अन्य जेपीए प्रदाता में बदलना चाहते हैं तो यह बहुत सीधे आगे होना चाहिए। जेपीए के लिए जाने का एक और फायदा यह है कि जेपीए-इंटरफेस हाइबरनेट की तुलना में अधिक स्थिर हैं।

+0

तो क्या मैं अपने हाइबरनेट पुस्तकालयों को हटा सकता हूं? कौन सा बेहतर अभ्यास है, मेरा समाधान या उसका? मैं अपने समाधान के साथ 'hibernate.hbm2ddl.auto' का उपयोग नहीं कर सकता? – Jaanus

+1

@ जेनस मैंने सर्वोत्तम अभ्यास के बारे में उत्तर अपडेट किया है और क्या आप हाइबरनेट पुस्तकालयों को हटा सकते हैं (आप नहीं कर सकते)। तुम अब भी hibernate.hbm2ddl.auto उपयोग कर सकते हैं: entityManagerFactory में: <संपत्ति नाम = "jpaProperties"> अगर मैं जेपीए का उपयोग <सहारा key = "hibernate.hbm2ddl.auto"> $ {hibernate.hbm2ddl.auto}

+0

रास्ता कॉन्फ़िगरेशन, क्या कोई अंतर है यदि मेरे पास 3.X निर्भरता या हाइबरनेट 4.X है? – grep

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