Spring Boot整合Hibernate仅生成Schema不生成表的解决方法咨询
解决Hibernate自动生成Schema但未创建表的问题
看起来你遇到的核心问题是配置项冲突以及部分配置格式的小问题,咱们一步步来解决:
1. 修复配置文件中的冲突项
你的application.properties里同时存在两个控制DDL生成的配置,这会导致Hibernate行为混乱:
spring.jpa.hibernate.ddl-auto=create:这是Spring Boot封装的配置,用于指定Hibernate的DDL自动生成策略hibernate.hbm2ddl.auto=validate:这是原生Hibernate的配置,validate策略只会验证实体与数据库表的匹配性,不会创建新表
这两个配置优先级重叠,直接导致create的配置被覆盖,所以表不会生成。你需要统一保留其中一个配置,并设置为正确的策略,推荐使用Spring Boot的配置方式,修正后的配置片段如下:
#jdbc spring.jpa.hibernate.ddl-auto=create jdbc.driverClassName=com.mysql.jdbc.Driver # 注意:properties文件里不需要转义&,直接用&即可 jdbc.url = jdbc:mysql://127.0.0.1:3306/tutor?createDatabaseIfNotExist=true&useUnicode=yes&characterEncoding=UTF-8 jdbc.user= root jdbc.password = # hibernate.X hibernate.dialect=org.hibernate.dialect.MySQL5DBDialect hibernate.show_sql=true # 建议打开,方便查看DDL执行日志 # 移除或注释掉冲突的原生配置 # hibernate.hbm2ddl.auto=validate pool.size=2
2. 确保实体类被Spring Boot扫描到
Hibernate只能为被Spring管理的实体类生成表,你需要确认:
- 你的
Account实体类所在的包,和Spring Boot主启动类的包是同一个或其子包(默认扫描主类所在包及子包) - 如果实体类在其他包下,需要在主启动类上添加
@EntityScan("你的实体类包路径")注解,比如:
@SpringBootApplication @EntityScan("com.yourpackage.model") public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
3. 实体类的小优化(可选)
你的Account实体类注解基本正确,不过可以明确指定表名(如果需要),同时确保所有字段的getter/setter都完整(当前代码里缺少password和id的setter,这虽然不影响表生成,但会影响后续数据操作):
@Entity @Table(name = "account") // 可选,指定表名,默认是类名小写 public class Account implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column private Integer id; @Column(nullable = false, unique = true) // 可以添加字段约束,比如用户名非空唯一 private String username; @Column(nullable = false) private String password; // 补全所有getter和setter public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
做完以上调整后,重启你的应用,Hibernate应该会自动创建tutor库下的account表了。如果还是有问题,可以打开hibernate.show_sql=true查看控制台输出的SQL,确认DDL语句是否正常执行。
内容的提问来源于stack exchange,提问作者Trần Xuân Huy
相关产品推荐
相关产品推荐

