gpt4 book ai didi

java - 当 transactionManager 没有被命名为 "transactionManager"

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:23 30 4
gpt4 key购买 nike

我正在尝试 Spring 3(.0.2.RELEASE) 和 JPA2 以及 Hibernate 3.5.1-Final...让我不爽的一件事是 spring 似乎只接受一个名为“transactionManager”的事务管理器

如果我不将其命名为“transactionManager”,Spring 将抛出 NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined.

这是我的配置:

<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”?(我正在运行多个 spring 配置文件,所以我尽量避免名称冲突)

测试代码:

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

最佳答案

我的理解是,在单元测试的上下文中 (TransactionalTestExecutionListener),查找事务管理器的代码被使用(TransactionInterceptor#determineTransactionManager)。

您可以尝试用 @TransactionConfiguration 注释您的测试类,它接受一个 transactionManager 属性。这不是最优雅的方式,但可能是目前最好的选择。

关于java - 当 transactionManager 没有被命名为 "transactionManager",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3027511/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com