2010-06-12 11 views
5

मैं स्प्रिंग 3 (.0.2.RELEASE) और जेपीए 2 और हाइबरनेट 3.5.1-फाइनल की कोशिश कर रहा हूं ... एक चीज मुझे परेशान करती है कि वसंत केवल एक लेनदेन प्रबंधक को " transactionManager "जब लेन-देन प्रबंधक को "लेनदेन प्रबंधक" नाम नहीं दिया जाता है

मैं इसे नामित नहीं करते हैं" transactionManager ", स्प्रिंग फेंकता होगा NoSuchBeanDefinitionException: नहीं सेम 'transactionManager' परिभाषित किया गया है नाम दिया है।

यहाँ मेरी config है:

<context:component-scan base-package="destiny.data.mining"/> 

<context:annotation-config/> 

<bean id="miningEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="mining"/> 
</bean> 

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

<tx:advice id="txAdviceMining" transaction-manager="miningTransactionManager"> 
    <tx:attributes> 
    <tx:method name="get*" read-only="true"/> 
    <tx:method name="save*" propagation="REQUIRED"/> 
    <tx:method name="update*" propagation="REQUIRED"/> 
    <tx:method name="delete*" propagation="REQUIRED"/> 
    <tx:method name="*" propagation="SUPPORTS" read-only="true"/> 
    </tx:attributes> 
</tx:advice> 

<aop:config> 
    <aop:pointcut id="methods" expression="execution(* destiny.utils.AbstractDao+.*(..))"/> 
    <aop:advisor advice-ref="txAdviceMining" pointcut-ref="methods"/> 
</aop:config> 

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

इस config में, एक इकाई प्रबंधक फैक्टरी है नहीं जरूरी "entityManagerFactory", और "txAdvice" नाम दिया गया है नहीं जरूरी, नाम "txAdvice" या तो। लेकिन मुझे नहीं पता कि पृथ्वी पर वसंत के लिए "लेनदेन प्रबंधक" नामक एक लेनदेन प्रबंधक की आवश्यकता क्यों है?

कोई लेनदेन प्रबंधक "लेनदेन प्रबंधक" नाम देने का कोई तरीका नहीं है? (मैं कई वसंत config फ़ाइलों चल रहा हूँ, इसलिए मैं नाम परस्पर विरोधी से बचने के लिए पूरी कोशिश)

परीक्षण कोड:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:mining.xml"}) 
public class MiningPersonDaoTest 
{ 
    @Inject 
    private EntityManagerFactory miningEntityManagerFactory; 

    @Inject 
    private MiningPersonDao miningPersonDao; 


    @Transactional 
    @Test 
    public void testUpdate() 
    { 
    MiningPerson p = miningPersonDao.get(42L); 
    p.setLocationName("OOXX"); 
    miningPersonDao.update(p); 
    System.out.println(p); 
    } 
} 

उत्तर

7

मेरे समझ है कि इकाई परीक्षण के संदर्भ (TransactionalTestExecutionListener) में , कोड जो अन्यथा लेनदेन प्रबंधक को देखता है उपयोग नहीं किया गया (TransactionInterceptor#determineTransactionManager)।

आप @TransactionConfiguration के साथ अपनी टेस्ट क्लास को एनोटेट करने का प्रयास कर सकते हैं, जो transactionManager विशेषता स्वीकार करता है। सबसे सुरुचिपूर्ण तरीका नहीं है, लेकिन संभवतः समय के लिए सबसे अच्छा विकल्प है।

+0

धन्यवाद! यह हल हो गया है! – smallufo

+0

लेकिन मैं अभी भी चिंतित हूं कि डीएओ को अन्य ढांचे (जैसे विकेट) में इंजेक्शन दिया गया है, क्या यह अभी भी विकेट के घटक को @ ट्रान्सएक्शन कॉन्फ़िगरेशन जोड़ने में सक्षम है? – smallufo

+0

आपको यह सुनिश्चित करने के लिए प्रयास करना होगा, लेकिन मुझे लगता है कि "असली" संदर्भ में, आपको किसी भी टिप्पणी की आवश्यकता नहीं होगी - वसंत बीन आईडी के आधार पर सही लेनदेन प्रबंधक को देखेगा। अच्छा होगा अगर आप यहां अपने परिणाम पोस्टरिटी के लिए भी पोस्ट कर सकते हैं। –

3

आज, मैं एक ही मुद्दे में भाग गया जब मैं स्प्रिंग-डेटा जेपीए के बहुत ही छोटे उदाहरण की कोशिश कर रहा था। मैंने लेनदेन प्रबंधक, "dmTransactionManager" को कस्टम नाम दिया था। इसे ठीक करने के लिए मुझे इसे निर्दिष्ट करना था, मुझे इसे नीचे निर्दिष्ट करना था:

<jpa:repositories base-package="com.my.repository" transaction-manager-ref="dmTransactionManager"/> 
संबंधित मुद्दे