2010-06-12 4 views
5

Я пытаюсь использовать Spring 3 (.0.2.RELEASE) и JPA2 и Hibernate 3.5.1-Final ... Меня удивляет одна из причин, почему весна кажется приемлемой для диспетчера транзакций с именем " transactionManager "Когда transactionManager не назван «transactionManager»

Если я не назову его« transactionManager », Spring будет выбрасывать NoSuchBeanDefinitionException: бит bean с именем« transactionManager » не определен.

Вот мой конфиг:

<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"/> 

В этой конфигурации, Субъект менеджер Фабрика не обязательно назвали «EntityManagerFactory», и «txAdvice» является не обязательно назвали «txAdvice», либо. Но я не знаю, почему на Земле весной нужен менеджер транзакций с именем «transactionManager»?

Можно ли каким-либо образом назвать диспетчера транзакций «transactionManager»? (Я бег несколько файлов весна конфигурации, поэтому я стараюсь, чтобы избежать имени-противоречивое)

тестового код:

@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

Но я все еще беспокоюсь о том, что DAO вводится в другие рамки (например, Wicket), может ли он добавить @TransactionConfiguration в компонент компоновки калитки? – smallufo

+0

Вам нужно попробовать, чтобы убедиться, но я * думаю *, что в «реальном» контексте вам не понадобятся аннотации - Spring будет искать правильный transactionManager, основанный на идентификаторе компонента. Было бы здорово, если бы вы могли опубликовать свои результаты здесь, чтобы потомство тоже увидело. –

3

Сегодня я столкнулся с тем же вопросом, когда пытался попробовать тривиальный пример JPA Spring-Data. Я дал свое имя менеджеру транзакций «dmTransactionManager». Чтобы исправить это, я должен был указать его, я должен был указать его, как показано ниже:

<jpa:repositories base-package="com.my.repository" transaction-manager-ref="dmTransactionManager"/>