【问题标题】:spring-data - multiple DB: NoUniqueBeanDefinitionException No qualifying bean of type 'TransactionManager' availablespring-data - 多个 DB:NoUniqueBeanDefinitionException 没有可用的“TransactionManager”类型的合格 bean
【发布时间】:2021-12-25 08:13:10
【问题描述】:

我创建了一个带有两个数据源 GitHub 的 spring-data 项目(版本 = 2.5.5)。只要我使用接口CrudRepository.java,它就可以正常工作。但是当我尝试基于SimpleJpaRepository.java 实现我自己的 DAO 时,我收到了错误

No qualifying bean of type 'org.springframework.transaction.TransactionManager' available: expected single matching bean but found 2: db1TransactionManager,db2TransactionManager

DB2Config.java(DB1Config.java 相同,但 bean 名称不是 '2',而是 '1')

@Configuration
@PropertySource("classpath:db2-config.properties")
@EnableJpaRepositories(
        basePackages = "com.vscoding.jpa.db2.entity",
        entityManagerFactoryRef = "db2EntityManagerFactory",
        transactionManagerRef = "db2TransactionManager"
)
public class DB2Config {

  @Bean
  @ConfigurationProperties(prefix = "db2.datasource")
  public DataSource db2DataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean
  public FactoryBean<EntityManagerFactory> db2EntityManagerFactory(@Qualifier("db2DataSource") DataSource db2DataSource, Environment env){
    var em = new LocalContainerEntityManagerFactoryBean();
    var va = new HibernateJpaVendorAdapter();
    var properties = new HashMap<String,Object>();

    properties.put("hibernate.hbm2ddl.auto","create");
    em.setDataSource(db2DataSource);
    em.setPackagesToScan("com.vscoding.jpa.db2.entity");
    em.setJpaVendorAdapter(va);
    em.setJpaPropertyMap(properties);

    return em;
  }

  @Bean
  public PlatformTransactionManager db2TransactionManager(@Qualifier("db2EntityManagerFactory") FactoryBean<EntityManagerFactory> db2EntityManagerFactory) throws Exception {
    var tm = new JpaTransactionManager();

    tm.setEntityManagerFactory(db2EntityManagerFactory.getObject());

    return tm;
  }

  @Bean
  @Profile("with-init")
  public DataSourceInitializer dataSourceInitializer2(@Qualifier("db2DataSource") DataSource datasource) {
    var populator = new ResourceDatabasePopulator();
    populator.addScript(new ClassPathResource("db2.sql"));

    DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
    dataSourceInitializer.setDataSource(datasource);
    dataSourceInitializer.setDatabasePopulator(populator);

    return dataSourceInitializer;
  }
}

ProductCustomRepository.java

@Repository
@Transactional(transactionManager = "db2TransactionManager")
public class ProductCustomRepository extends SimpleJpaRepository<ProductEntity2, Integer> {
  private final EntityManager entityManager;

  public ProductCustomRepository(@Qualifier("db2EntityManagerFactory") EntityManager entityManager) {
    super(ProductEntity2.class, entityManager);
    this.entityManager = entityManager;
  }

  public List<ProductEntity2> customQuery() {
    var query = entityManager.createQuery("SELECT p FROM ProductEntity2 p WHERE p.name='special'",ProductEntity2.class);

    return query.getResultList();
  }
}

我希望@Transactional(transactionManager = "db2TransactionManager") 会选择正确的transactionManager,但也许我错过了什么。

ProductCustomRepositoryTest.java(测试重现错误)

@SpringBootTest
class ProductCustomRepositoryTest {
  @Autowired
  private ProductCustomRepository sut;

  @Test
  void customQuery() {
    //Given
    var special = new ProductEntity2("special");
    sut.save(special);

    //When
    var result = sut.customQuery();

    //Then
    assertTrue(result.contains(special));
  }
}

提前致谢。

【问题讨论】:

标签: java jpa transactions spring-data


【解决方案1】:

正如 Simon 所说,我可以通过关注 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations 来解决错误

将我的ProductCustomRepository.java更改为CustomRepositoryImpl.java并添加接口CustomRepository.java

@Repository
@Transactional(transactionManager = "db2TransactionManager")
public class CustomRepositoryImpl implements CustomRepository {
  // no changes here
}

然后使用接口扩展我的主存储库。

public interface ProductRepository2 extends CrudRepository<ProductEntity2,Integer>,CustomRepository {
}

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2023-03-12
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2020-05-24
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
相关资源
最近更新 更多