分层多项目架构下Spring Data配置及数据库自动创建问题
Spring Boot默认以@SpringBootApplication标注的启动类所在包为根路径,向下扫描所有Spring组件、JPA实体、Repository接口。你的项目中@Entity实体类放在和presentation包平级的infrastructure包下,不在默认扫描范围内,JPA无法识别实体类,因此无法自动创建数据库表。
按照以下配置调整即可解决:
配置全局Spring组件扫描(可选但推荐)
如果你的Service、配置类等组件也分散在presentation包之外的其他分层包中,直接修改启动类的@SpringBootApplication注解,指定扫描整个项目的根包,覆盖默认扫描规则:// 替换为你项目的实际根包路径 @SpringBootApplication(scanBasePackages = "com.yourcompany.yourproject")配置JPA实体扫描路径
在启动类上添加@EntityScan注解,指定infrastructure层存放实体类的包路径:// 替换为你项目实体类的实际存放路径 @EntityScan(basePackages = "com.yourcompany.yourproject.infrastructure.entity")配置JPA Repository扫描路径
如果你的Repository接口也放在infrastructure包下,添加@EnableJpaRepositories注解指定扫描路径:// 替换为你项目Repository接口的实际存放路径 @EnableJpaRepositories(basePackages = "com.yourcompany.yourproject.infrastructure.repository")MyBatis/MyBatis-Plus适配(如果使用)
若用MyBatis系列框架而非JPA,在启动类上添加@MapperScan注解指定Mapper接口路径:// 替换为你项目Mapper接口的实际存放路径 @MapperScan(basePackages = "com.yourcompany.yourproject.infrastructure.mapper")同时在application.yml/application.properties中配置Mapper XML文件路径:
# MyBatis配置示例 mybatis: mapper-locations: classpath:mapper/*.xml # MyBatis-Plus配置示例 mybatis-plus: mapper-locations: classpath:mapper/*.xml
package com.yourcompany.yourproject.presentation; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication(scanBasePackages = "com.yourcompany.yourproject") @EntityScan(basePackages = "com.yourcompany.yourproject.infrastructure.entity") @EnableJpaRepositories(basePackages = "com.yourcompany.yourproject.infrastructure.repository") @MapperScan(basePackages = "com.yourcompany.yourproject.infrastructure.mapper") public class ProjectApplication { public static void main(String[] args) { SpringApplication.run(ProjectApplication.class, args); } }
注意:需要同时确保你的数据源配置、JPA/MyBatis的自动建表配置正确,比如JPA要配置
spring.jpa.hibernate.ddl-auto为update/create等非none值(生产环境务必改为none避免数据丢失)。
内容的提问来源于stack exchange,提问作者kim

