You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:50:14