多数据源下同名Repository使用方法及同名表Repository创建报错求助
我来帮你搞定这两个Spring多数据源的常见问题,都是实际项目里容易踩的坑👇
多数据源场景下遇到同名的Repository(比如两个库都有SummaryDao),核心思路就是给不同数据源的Repository做“分组标识”,让Spring能区分开它们,具体操作可以这么来:
先给每个数据源配置独立的扫描路径:
比如你有两个数据源(用户库、业务库),分别写两个数据源配置类,在@EnableJpaRepositories里指定不同的basePackages。比如用户库的配置类扫com.tc.spider.dao.user,业务库的扫com.tc.spider.dao.biz,把同名的SummaryDao分别放在这两个包下。同时别忘了给每个配置类指定对应的entityManagerFactoryRef和transactionManagerRef,绑定到各自的数据源上。注入时用
@Qualifier明确指定Bean:
就算放在不同包,类名还是一样的,直接按类型注入可能会有歧义。这时候可以在注入时加上@Qualifier,指定Bean的名称(默认是类名首字母小写,或者你可以在Dao上用@Repository("userSummaryDao")自定义名称):@Autowired @Qualifier("userSummaryDao") private SummaryDao userSummaryDao; @Autowired @Qualifier("bizSummaryDao") private SummaryDao bizSummaryDao;
看你的报错信息:Field summaryDao in ... required a bean of type 'com.tc.spider.dao.user.SummaryDao' that could not be found.,本质是Spring没扫描到这个Dao的Bean,大概率是这几个原因:
检查数据源配置的扫描路径:
负责用户库的数据源配置类里,@EnableJpaRepositories的basePackages有没有包含com.tc.spider.dao.user?比如:@Configuration @EnableJpaRepositories( basePackages = "com.tc.spider.dao.user", entityManagerFactoryRef = "userEntityManagerFactory", transactionManagerRef = "userTransactionManager" ) @EnableTransactionManagement public class UserDataSourceConfig { // 这里放数据源、EntityManagerFactory、TransactionManager的配置代码 }如果路径没写对,Spring根本不会去扫这个包下的Dao,自然找不到Bean。
排查多数据源扫描冲突:
如果另一个数据源的配置类也把com.tc.spider.dao.user加到了扫描路径里,Spring会搞不清这个Dao属于哪个数据源,导致无法正确创建Bean。这种情况要把扫描路径严格分开,每个数据源只扫自己对应的Dao包。确认Dao接口继承了Spring Data的Repository:
你的SummaryDao有没有继承JpaRepository或者CrudRepository?比如public interface SummaryDao extends JpaRepository<Summary, Long>?如果没继承,Spring不会把它识别为Repository Bean,自然也找不到。最后清理缓存重新编译:
有时候Maven/Gradle的编译缓存会搞事情,删掉target/build目录,重新编译运行试试,说不定就好了。
内容的提问来源于stack exchange,提问作者Sailor

