2010-06-12 28 views
5

Tôi đang thử Spring 3 (.0.2.RELEASE) và JPA2 và Hibernate 3.5.1-Final ... Một điều làm tôi bực mình là mùa xuân dường như chỉ chấp nhận người quản lý giao dịch có tên " transactionManager "Khi transactionManager không được đặt tên là "transactionManager"

Nếu tôi không đặt tên là" transactionManager ", Spring sẽ ném NoSuchBeanDefinitionException: Không có bean nào có tên 'transactionManager' được xác định.

Dưới đây là cấu hình của tôi:

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

Trong cấu hình này, một Giám đốc Nhà máy Entity là không nhất thiết có tên là "entityManagerFactory", và "txAdvice" được không nhất thiết có tên là "txAdvice", một trong hai. Nhưng tôi không biết tại sao Spring lại yêu cầu người quản lý giao dịch có tên là "transactionManager"?

Có cách nào để không đặt tên cho người quản lý giao dịch là "transactionManager" không? (Tôi đang chạy nhiều file mùa xuân cấu hình, vì vậy tôi cố gắng hết sức để tránh tên mâu thuẫn)

đang

kiểm tra:

@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); 
    } 
} 

Trả lời

7

sự hiểu biết của tôi là trong bối cảnh kiểm tra đơn vị (TransactionalTestExecutionListener) , mã mà nếu không tìm kiếm người quản lý giao dịch là không được sử dụng (TransactionInterceptor#determineTransactionManager).

Bạn có thể cố gắng chú thích lớp thử nghiệm của mình với @TransactionConfiguration, chấp nhận thuộc tính transactionManager. Không phải là cách thanh lịch nhất, nhưng có thể là lựa chọn tốt nhất trong thời gian này.

+0

Cảm ơn bạn! Nó đã được giải quyết! – smallufo

+0

Nhưng tôi vẫn lo lắng về việc DAO có được tiêm vào các khung công tác khác (chẳng hạn như Wicket) hay không, liệu nó vẫn có thể thêm @TransactionConfiguration vào compoment của wicket? – smallufo

+0

Bạn sẽ phải thử nó để chắc chắn, nhưng tôi nghĩ * rằng trong ngữ cảnh "thực", bạn sẽ không cần bất kỳ chú thích nào - Spring sẽ tra cứu đúng TransactionManager dựa trên id bean. Sẽ là tuyệt vời nếu bạn có thể đăng kết quả của bạn ở đây cho hậu thế để xem là tốt. –

3

Hôm nay, tôi đã gặp phải vấn đề tương tự khi tôi đang thử một ví dụ rất nhỏ về JPA Spring-Data. Tôi đã đặt tên tùy chỉnh cho người quản lý giao dịch, "dmTransactionManager". Để khắc phục, tôi phải chỉ định nó, tôi phải chỉ định nó như sau:

<jpa:repositories base-package="com.my.repository" transaction-manager-ref="dmTransactionManager"/> 
Các vấn đề liên quan