Spring JPA与Hibernate连接Heroku PostgreSQL无法自动创建数据表问题
问题原因及解决方案
核心原因
- 实体类未被Spring扫描到:Spring Boot默认仅扫描启动类所在包及其子包下标注了
@Entity的类,若Student类存放路径不在该范围内,Spring不会识别该实体,自然不会触发建表逻辑。从启动日志中Found 0 JPA repository interfaces也能看出当前项目没有被扫描到JPA相关组件,大概率存在扫描范围问题。 - 配置参数冲突冗余:你的配置中同时存在
hibernate.hbm2ddl.auto、javax.persistence.schema-generation.database.action、spring.jpa.generate.ddl-auto、spring.jpa.hibernate.ddl-auto多个功能相似的参数,Spring Boot下仅识别spring.jpa前缀的JPA配置,无Spring前缀的原生Hibernate配置不生效,且你写错了spring.jpa.generate-ddl参数(写成了spring.jpa.generate.ddl-auto),多重冲突导致建表逻辑未触发。 - 数据库schema权限问题:若连接PostgreSQL的用户没有默认schema的建表权限,或指定的schema不存在,也会导致建表失败,该情况通常会在日志中抛出权限相关报错,若你日志无报错可优先排查前两个原因。
解决步骤
修正实体类扫描规则
优先将Student类放到启动类所在包的子目录下;如果要自定义存放路径,在启动类上添加@EntityScan(basePackages = "替换为Student类所在的完整包名")注解,明确指定实体扫描范围。清理冗余冲突配置
删除application.properties中无效的冲突参数,仅保留必要配置,参考配置如下:
# 数据源配置 spring.datasource.url=jdbc:postgresql://<host>:<port>/<dbname> spring.datasource.username=<user> spring.datasource.password=<pwd> spring.datasource.driver-class-name=org.postgresql.Driver spring.sql.init.mode=always spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true spring.jpa.defer-datasource-initialization=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL95Dialect spring.jpa.properties.hibernate.format_sql=true
- 可选:指定schema与权限校验
若确认存在schema问题,可在数据源URL后追加schema指定参数:jdbc:postgresql://<host>:<port>/<dbname>?currentSchema=public,同时确认数据库账号拥有对应schema的CREATE、ALTER等权限。
内容的提问来源于stack exchange,提问作者Kalio O'Farril
相关产品推荐
相关产品推荐

