Spring的JpaRepository是如何找到并连接数据库服务器的?
JpaRepository 数据库匹配逻辑说明
默认单数据源场景的自动绑定逻辑
Sagan基于Spring Boot构建,相关绑定逻辑由Spring Boot的自动装配能力默认实现,因此你在业务代码中找不到自定义的关联逻辑,完整流程如下:
- 首先读取配置文件中的数据源参数:Spring Boot会自动加载项目中
application.properties/application.yml里spring.datasource.*前缀的配置,包括数据库连接地址、驱动类、用户名、密码,这一步直接锁定了目标数据库服务,哪怕本地运行多个数据库实例,也只会连接配置中指定的那个库。 - 其次完成实体与数据源的绑定:数据源初始化完成后,Spring会为该数据源创建对应的
EntityManager实例,默认会扫描项目中所有标注了@Entity的实体类,将其关联到这个EntityManager上,EntityManager负责实体与表的映射校验、SQL生成与执行。 - 最后完成Repository与数据源的绑定:你定义的
PostRepository这类继承JpaRepository的接口,Spring Data JPA会自动生成对应的实现类,默认绑定到全局唯一的EntityManager上,所以所有Repository的操作都会走对应数据源的连接。
这一整套逻辑都是Spring Boot默认提供的自动装配能力,不需要业务代码额外实现,这也是你在Sagan代码库中找不到关联逻辑的原因。
多数据源场景的手动绑定逻辑
如果同一个项目需要同时连接多个不同的数据库(比如同时连接PostgreSQL和MySQL),才需要手动编写绑定逻辑,规则如下:
- 分别为每个数据源创建独立的
DataSource、EntityManager实例 - 为每个
EntityManager指定专属的实体类扫描路径,以及对应的Repository接口扫描路径 - 不同扫描路径下的Repository会自动关联到对应的
EntityManager,从而操作不同的数据库,不会出现串库的问题
同名表的匹配规则
你担心的不同库存在同名表的问题不会发生:
- JpaRepository绑定的
EntityManager已经关联了固定的数据源,只会在当前连接的数据库中查找表,不会扫描其他数据库服务的表,因此其他库的同名表不会被访问到。 - 如果是同一个数据库内不同schema存在同名表,可以通过
@Table注解的schema属性指定专属schema,即可精准匹配到目标表。
内容的提问来源于stack exchange,提问作者Namudon'tdie
相关产品推荐
相关产品推荐

