Spring Boot集成PostgreSQL无法建表及Bean依赖注入异常求助
解决方案
1. 修正主类扫描注解错误
你的主类中@EnableJpaRepositories和@EntityScan的包路径完全搞反了,这是导致Repository找不到的直接原因:
// 错误配置 @EnableJpaRepositories("com.cheng.imms.parking.model") @EntityScan("com.cheng.imms.parking.repository") // 修正后配置 @EnableJpaRepositories("com.cheng.imms.parking.repository") // 指向Repository所在包 @EntityScan("com.cheng.imms.parking.model") // 指向实体类所在包
同时移除多余的@ComponentScan,因为@SpringBootApplication默认会扫描主类所在包及其所有子包,你的service、repository都属于子包范畴,无需额外配置。修正后的主类代码:
@EnableJpaRepositories("com.cheng.imms.parking.repository") @EntityScan("com.cheng.imms.parking.model") @SpringBootApplication public class ImmsApplication { @GetMapping("/hi") @ResponseBody public String sayHello(){ return "Hello i'm admin's page"; } public static void main(String[] args) { SpringApplication.run(ImmsApplication.class, args); } }
2. 修复JPA实体继承映射问题
父类Utilisateur已定义主键,子类Admin、Chauffeur不应再单独定义@Id字段,否则Hibernate无法正确解析继承关系,导致表无法自动创建。
具体修改:
(1)调整父类Utilisateur的继承策略
添加继承策略注解,并给枚举字段指定存储类型:
@Entity @Table(name = "users") @Data @NoArgsConstructor @Inheritance(strategy = InheritanceType.JOINED) // 采用JOINED策略,每个实体对应独立表 public class Utilisateur { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id_user; @Enumerated(EnumType.STRING) // 指定枚举以字符串形式存储 @Column(name = "role",nullable = false, length = 100) private Role role; // 其余字段、构造方法保持不变 }
(2)修改Admin类,移除独立主键
使用@PrimaryKeyJoinColumn关联父类主键,并修正关联映射:
@Entity @Table(name = "admins") @NoArgsConstructor @Data @PrimaryKeyJoinColumn(name = "id_admin") // 关联父类id_user到当前表的id_admin字段 public class Admin extends Utilisateur { // 移除原有的@Id和id_admin字段 @OneToMany(mappedBy = "admin") // 指定关联的子类字段 private List<Parking> parkingList = new ArrayList<>(); @OneToMany(mappedBy = "admin") private List<Chauffeur> chauffeurList = new ArrayList<>(); // 移除构造方法中的id_admin参数 public Admin(String login, String password, Role role, String nom_user, String prenom_user){ super(login,password, role, nom_user,prenom_user); } }
(3)修改Chauffeur类,移除独立主键
@Entity @Table(name = "chauffeurs") @Data @NoArgsConstructor @PrimaryKeyJoinColumn(name = "id_chauffeur") public class Chauffeur extends Utilisateur { // 移除原有的@Id和id_chauffeur字段 @ManyToOne @JoinColumn(name = "id_admin") // 指定外键字段名 private Admin admin ; // 移除构造方法中的id_chauff参数 public Chauffeur(String login, String password, Role role, String nom_user, String prenom_user){ super(login,password, role, nom_user,prenom_user); } }
(4)完善Parking类
添加无参构造方法(JPA强制要求),确保关联配置正确:
@Entity @Table(name = "parkings") @Data @NoArgsConstructor public class Parking { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id_park; // 其余字段保持不变 @ManyToOne @JoinColumn(name = "id_admin") private Admin admin; }
3. 确保数据库Schema存在
你的配置指定了spring.datasource.hikari.schema=sc_IMMS,需确保PostgreSQL中已创建该Schema:
- 手动执行SQL:
CREATE SCHEMA sc_IMMS; - 或添加配置自动创建(仅开发环境使用):
spring.datasource.hikari.connection-init-sql=CREATE SCHEMA IF NOT EXISTS sc_IMMS;
4. 验证核心配置
确保application.properties中的JPA配置正确:
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.show-sql=true spring.datasource.url=jdbc:postgresql://localhost:5432/immsDB spring.datasource.hikari.schema=sc_IMMS spring.datasource.username=admin spring.datasource.password=123
5. 额外检查点
- 确认
Role枚举类已正确定义,包含实体中使用的所有枚举值 - 所有Repository接口都继承了
JpaRepository或其扩展类,例如:
public interface ChauffeurRepository extends JpaRepository<Chauffeur, Long> { }
- Service类中Repository的注入方式正确(推荐构造方法注入,或使用
@Autowired)
内容的提问来源于stack exchange,提问作者bousaada12
相关产品推荐
相关产品推荐

