2009-04-16 18 views
11

वसंत ढांचे के लेनदेन हैंडलिंग के साथ कितना दूर जाता है? अपने उदाहरणों के साथ "स्प्रिंग इन एक्शन" सुझावों के बारे में मेरी पढ़ाई, जिसमें आप डीएओ विधियां बनाते हैं जो सत्र और लेनदेन प्रबंधन के बारे में चिंता नहीं करते हैं, एक्सएमएल में एक सत्र फैक्ट्री और लेनदेन टेम्पलेट स्थापित करके और फिर उन्हें अपने डीएओ में तारों से जोड़ते हैं। दूसरी ओर, SpringSource.org के दस्तावेज़, यह सुझाव देते हैं कि ऐसा करने के लिए बहुत से एक्सएमएल और/या एनोटेशन की आवश्यकता है।वसंत के साथ स्वचालित हाइबरनेट लेनदेन प्रबंधन?

क्या सच यहाँ, क्या सबसे आसान तरीका मैं

get session from sessionfactory 
open transaction 
preform database actions 
commit transaction with error handling 

की तर्ज पर कोड लेने के लिए और यह सिर्फ

preform database actions 

बॉयलर प्लेट व्यवहार कोड की मात्रा को कम कर सकते हैं यह है कि मेरे पास मेरे तरीकों से कम से कम है?

उत्तर

10

स्प्रिंग लेन-देन सीमांकन की कम से कम 3 तरीके प्रदान करता है:

1) प्रोग्रामेटिक हैंडलिंग, TransactionTemplate या PlatformTransactionManager के माध्यम से - config पर प्रकाश है, लेकिन आक्रामक

2) XML के माध्यम से घोषणात्मक - वर्बोज़ एक्सएमएल, लेकिन गैर आक्रामक

3) एनोटेशन के माध्यम से घोषणात्मक - एक्सएमएल पर प्रकाश, आक्रामक नहीं

आप कौन-सी लेने पर निर्भर करता है अपनी आवश्यकताओं एक सबसे अच्छा सूट, वसंत आप के लिए है कि पसंद नहीं है । आपके प्रश्न से, ऐसा लगता है कि एनोटेशन दृष्टिकोण वह है जो आप कर रहे हैं।

मैं स्प्रिंग संदर्भ मैनुअल, एनोटेशन-संचालित लेनदेन हैंडलिंग का अनुभाग पढ़ने का सुझाव देता हूं। यह स्पष्ट और संक्षिप्त है।

मैं हमेशा पहले रेफ दस्तावेज़ों से परामर्श करता हूं, और यदि दस्तावेज़ों में नहीं है तो केवल एक पुस्तक से परामर्श लें।

11

ऐसा कुछ काम है जिसे आप ऐसा करने में सक्षम होने के लिए करना चाहते हैं लेकिन यह बिल्कुल भी नहीं है। माना जाता है कि आप अपने स्वयं के प्रदाता को चुनने के साथ जेपीए का उपयोग करेंगे, उदा। हाइबरनेट। ,

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 
    <persistence-unit name="YourDatabasePersistenceUnitName" transaction-type="RESOURCE_LOCAL"/>   
</persistence> 

इसके बाद, सब कुछ वसंत आवेदन संदर्भ आप उपयोग में डेटाबेस कनेक्शन के लिए आवश्यक परिभाषित कम से कम यह इन होना चाहिए: तो फिर तुम persistence.xml कि META-INF फ़ोल्डर में दृढ़ता इकाई को परिभाषित करता है रखने की आवश्यकता होगी

<bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>/WEB-INF/jdbc.properties</value>  
     </property> 
    </bean> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close" scope="singleton"> 
     <property name="driverClassName" value="org.postgresql.Driver"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="YourDatabasePersistenceUnitName"/> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="database" value="POSTGRESQL" /> 
       <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/> 
       <property name="showSql" value="true"/> 
       <property name="generateDdl" value="false"/> 
      </bean> 
     </property>  
    </bean> 

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

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

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

अब आप बस इस तरह अपने डेटा का उपयोग तरीकों को परिभाषित कर सकते हैं:

@Repository 
@Transactional 
public class UserJpaDAO { 

    protected EntityManager entityManager; 

    @PersistenceContext 
    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

    public void save(User theUser) { 
     entityManager.persist(theUser); 
    } 

    public User update(User theUser) { 
     return entityManager.merge(theUser); 
    } 
} 

जहां उपयोगकर्ता एक जेपीए इकाई अपने आवेदन से परिभाषित किया गया है। आप प्रबंधक/नियंत्रक परत पर प्रबंधक लेनदेन कर सकते हैं जो आपके डीएओ को कॉल करता है - असल में मैं इसे इस तरह से करता हूं - लेकिन मैंने इसे यहां एक साथ रखा है उदाहरण के लिए बहुत ज्यादा नहीं।

अच्छा संदर्भ है कि आप मेरी उदाहरण के सीधे करने के बजाय जाने के लिए चाहते हो सकता है http://icoloma.blogspot.com/2006/11/jpa-and-spring-fucking-cooltm_26.html शीर्ष 3 लिंक यह संदर्भ के रूप में अच्छी तरह से करने के लिए जा लायक हैं है।

+0

उत्तर के लिए धन्यवाद, मैं कल इस काम पर खेलूँगा। हालांकि, अंत में आपके दोनों लिंक समान हैं। –

+0

क्षमा करें, लेकिन मेरे द्वारा प्रदान किए गए लिंक में 3 अन्य लिंक शामिल हैं, जिनमें से एक मेरे मन में था ... – topchef

+0

अब लिंक नीचे दिखाई देता है ... –

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