2010-06-12 8 views
5

Spring 3 (.0.2.RELEASE)와 JPA2 및 Hibernate 3.5.1-Final을 시도 중입니다 ... 한 가지 일은 저에게 봄이 단지 " transactionManager "transactionManager의 이름이 "transactionManager"가 아닌 경우

"transactionManager "의 이름을 지정하지 않으면, Spring은 을 던집니다. NoSuchBeanDefinitionException : 'transactionManager'라는 bean이 없습니다.이 정의됩니다.

여기 내 설정이다 :

<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"라는. 하지만 왜 지구상에서 Spring은 "transactionManager"라는 트랜잭션 관리자가 필요합니까?

트랜잭션 관리자 "transactionManager"의 이름을 지정하지 않는 방법이 있습니까? (I 여러 스프링 설정 파일을 실행 해요, 그래서 이름 충돌을 피하기 위해 최선을 다할)

테스트 코드 :

@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과 같은 다른 프레임 워크에 삽입 되어도 여전히 걱정됩니다. 여전히 Wicket의 구성 요소에 @TransactionConfiguration을 추가 할 수 있습니까? – smallufo

+0

확실한 방법을 시도해보아야하지만, "실제"컨텍스트에서 주석이 필요 없다고 생각합니다. Spring은 bean id를 기반으로 올바른 transactionManager를 찾습니다. 후손이 볼 수 있도록 여기에 결과를 게시 할 수 있다면 좋을 것입니다. –

3

오늘 Spring-Data JPA의 아주 간단한 예를 시도했을 때 같은 문제가 발생했습니다. 트랜잭션 관리자 인 "dmTransactionManager"에 사용자 정의 이름을 지정했습니다. 그것을 고치려면 그것을 지정해야했는데 아래처럼 지정해야했습니다 :

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