JPA错误记录 No qualifying bean of type ‘javax.persistence.EntityManagerFactory‘ available

在已有多个数据源的复杂项目中,新增Spring Data JPA功能时遇到No qualifying bean错误。问题源于数据源配置和EntityManager的混淆。解决方案包括移除MyBatis的@Primary注解,将@Primary应用于新数据源,使用@Qualifier指定EntityManagerFactory,并规范化Bean命名。遵循统一的技术栈可以避免此类问题。
摘要由CSDN通过智能技术生成

最近在公司在一个已经很臃肿的项目上添加新功能,要求使用的是新数据库,并且使用Spring Data JPA。这让我很懵逼,因为此项目臃肿的程度已经无法想象了,里面有N+个数据源,并且ORM使用到了JDBC、mybatis、Spring Data JPA。如果当时约定使用相同的技术就不会出现问题了(前人种坑,后人填坑....)。

已经有的数据源配置:

1.使用mybatis配置的数据源且标记了主数据源:(Mybatis数据源配置有多个,我只列标记为@Primary的数据源)


@Configuration
@MapperScan(value = "com.xichuan.flow.mapper.flow", sqlSessionFactoryRef = "sqlSessionFactory")
public class FlowDataSourceConfig {

    @Primary
    @Bean(name="dataSource")
    @ConfigurationProperties(prefix="spring.flow_datasource")
    public DataSource flowDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(flowDataSource());
        return sessionFactory.getObject();
    }
}

2.已经有的JPA数据源


@SuppressWarnings(value = "unused")
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = {
                "com.xichuan.imap.repository"
        },
        entityManagerFactoryRef = "imapEntityManagerFactory",
        transactionManagerRef = "imaptransactionManager")
public class ImapDataSourceConfig {
    @Autowired
    private Environment env;

    public ImapDataSourceConfig() {
        super();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean imapEntityManagerFactory() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(imapDataSource());
        em.setPackagesToScan(
                new String[]{
                        "com.xichuan.imap.entity"
                }
        );

        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        return em;
    }

    @ConfigurationProperties(prefix = "spring.imap_datasource")
    public DataSource imapDataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("spring.imap_datasource.driverClassName")));
        dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("spring.imap_datasource.url")));
        dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("spring.imap_datasource.username")));
        dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("spring.imap_datasource.password")));

        final Properties propertiesJpa = new Properties();
        dataSource.setConnectionProperties(propertiesJpa);
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager imapTransactionManager(EntityManagerFactory emf) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

}

3.代码中使用到的EntityManager:

@Service
public class ImapServiceImpl{

    @Autowired
    private EntityManager mEntityManager;

    @PostConstruct
    public void initFactory() {
        logger.info("开始实例化JPAQueryFactory");
        mQueryFactory = new JPAQueryFactory(mEntityManager);
    }
...
...

}

乍一看并没有什么问题,对,我感觉没有问题,后来发现问题贼多..................

4.配置新代码的JPA数据源

@Configuration
@EnableJpaRep
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值