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)
đangkiể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);
}
}
Cảm ơn bạn! Nó đã được giải quyết! – smallufo
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
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. –