spring.jpa.hibernate.ddl-auto 程序启动时如何处理数据库表结构
spring.jpa.hibernate.ddl-auto
Hibernate 根据这个配置值,决定程序启动时如何处理数据库表结构(schema)
ddl-auto:自动管理数据表。应用每次启动,Hibernate 自动操作表、字段、约束;支持创建、更新、校验、删除表。
5 种模式对应:
- Builder mode → create
- Cleaner mode → create-drop
- Upgrader mode → update
- Inspector mode → validate
- Hands-off mode → none
二、application.properties 最简配置(直接复制)
properties
# 数据库连接(配合你的docker mysql) spring.datasource.url=jdbc:mysql://localhost:3306/jobportal?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8mb4&useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # =================ddl-auto 核心配置================= # 开发推荐用 update spring.jpa.hibernate.ddl-auto=update # 打印SQL(方便观察建表语句) spring.jpa.show-sql=true # 格式化SQL spring.jpa.properties.hibernate.format_sql=true # MySQL8方言 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
三、5 个可选值完整说明(面试重点)
properties
# 1. create 【Builder模式】
# 启动:先删除所有表 → 重新创建表
# 关闭:不删除表
spring.jpa.hibernate.ddl-auto=create
# 2. create-drop 【Cleaner模式】
# 启动:删表重建;项目正常关闭时自动删除全部表
# 仅用于单元测试!不要业务开发使用
spring.jpa.hibernate.ddl-auto=create-drop
# 3. update 【Upgrader模式|日常开发首选】
# 不会删除已有数据;只新增表、新增字段;不会删除旧字段
# ⚠️ 缺陷:不会自动删除实体里移除的字段
spring.jpa.hibernate.ddl-auto=update
# 4. validate 【Inspector模式】
# 不创建/修改表;只校验:实体类 和 数据库表结构是否匹配
# 结构不一致直接启动报错!适合准生产环境
spring.jpa.hibernate.ddl-auto=validate
# 5. none 【Hands-off模式|生产环境强制推荐】
# 完全关闭自动表管理,Hibernate不执行任何DDL语句
# 生产环境使用,表结构通过SQL脚本/迁移工具Flyway/Liquibase管理
spring.jpa.hibernate.ddl-auto=none
四、最简实体测试代码(验证自动建表)
java
运行
import jakarta.persistence.*; @Entity @Table(name = "contact_messages") public class Contact { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; private String message; // 无参构造(JPA必须要有) public Contact(){} // getter setter public Long getId() {return id;} public void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getEmail() {return email;} public void setEmail(String email) {this.email = email;} public String getMessage() {return message;} public void setMessage(String message) {this.message = message;} }
五、配套 Repository
java
运行
import org.springframework.data.jpa.repository.JpaRepository; public interface ContactRepository extends JpaRepository<Contact, Long> { }
六、学习使用建议
✅ 本地开发:
✅ 测试环境:
✅ 线上生产:
❌ 生产禁止使用 create /create-drop,会清空业务数据!
update
validate
none
******************************************************************************************************************************************************************************************************************************************************************************************************
******************************************************************************************************************************************************************************************************************************************************************************************************
******************************************************************************************************************************************************************************************************************************************************************************************************

浙公网安备 33010602011771号