【发布时间】:2018-06-19 12:16:03
【问题描述】:
我正在开发一个 Spring-MVC 应用程序,其中我为不同类型的任务定义了 2 个数据源。目前,在从 XML 迁移到 Java 的过程中,我偶然发现需要添加一个新的 HibernateTransactionManager 对象以使 @Transactional 工作。对于 2 个不同的数据源,我有 2 个单独的 SessionFactory 实例。但是当我尝试使用辅助数据源创建另一个 HibernateTransactionManager 实例时,我得到一个非唯一异常。
对于我发布的配置,我是否需要一个辅助 HibernateTransactionManager 实例,或者 1 个就足够了?如果需要,我如何创建一个?谢谢。
错误日志:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: primary_tx,extended_tx
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:368)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:367)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:271)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springfram
WebConfig.java:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.ourapp.spring"})
@EnableTransactionManagement
@EnableCaching
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean(name="primary_tx")
public HibernateTransactionManager getPrimaryTransactionManager() throws IOException {
HibernateTransactionManager txName= new HibernateTransactionManager();
txName.setSessionFactory(sessionFactory().getObject());
return txName;
}
@Bean(name="extended_tx")
public HibernateTransactionManager txName() throws IOException {
HibernateTransactionManager txName= new HibernateTransactionManager();
txName.setSessionFactory(getExtendedSessionFactory().getObject());
return txName;
}
@Bean
@Qualifier("sessionFactory_origin")
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(new DataSourceConfig().primaryDataSource());
sessionFactory.setPackagesToScan("com.ourapp.spring");
return sessionFactory;
}
@Bean
@Qualifier("sessionFactory_extended")
public LocalSessionFactoryBean getExtendedSessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(new DataSourceConfig_Extended().secondaryDataSource());
sessionFactory.setPackagesToScan("com.ourapp.spring");
return sessionFactory;
}
}
典型的服务层方法:
@Service
@Transactional("primary_tx")
public class ChatRoomMembersServiceImpl implements ChatRoomMembersService{
private final ChatRoomMembersDAO chatRoomMembersDAO;
@Autowired
public ChatRoomMembersServiceImpl(ChatRoomMembersDAO chatRoomMembersDAO){
this.chatRoomMembersDAO = chatRoomMembersDAO;
}
}
典型的DAO层方法:
@Repository
@Transactional("primary_tx")
public class ChatRoomMembersDAOImpl implements ChatRoomMembersDAO{
@Autowired
@Qualifier(value = "sessionFactory_origin")
private SessionFactory sessionFactory;
@Autowired
@Qualifier(value = "sessionFactory_extended")
private SessionFactory sessionFactory_extended;
}
现在,每当需要时,我指的是扩展的 SessionFactory 实例。现在,我已经用secondary_tx 注释了需要扩展 sessionFactory 的 DAO 层方法,但它不起作用。谢谢你。 :-)
【问题讨论】:
标签: java spring spring-mvc migration