ddl-auto 选项:

hibernate:  
  ddl-auto: update  # 可选值:none, update, create, create-drop, validate 
  • none: 不做任何操作, 即不使用 Hibernate 自动生成表结构 1
  • update: 更新表结构
  • create: 每次启动删除旧表创建新表
  • create-drop: 启动时创建,结束时删除
  • validate: 验证表结构,不会更改数据库

建议:

  • 开发时使用 update, 但要注意检查生成的表结构是否符合预期
  • 测试时使用 create 或 create-drop
  • 生产使用 none 并配合数据库迁移工具管理表结构, 禁用 Hibernate 的自动表生成功能
  • 如果你已经通过 hibernate 的 ddl-auto 配置(如 update 或 create)让 Hibernate 自动生成数据库表结构,那么通常不需要再额外配置 sql.init 来加载数据库表初始化脚本 ( schema-locations: )(如 schema-init.sql)。
  sql:
    init:
      # - always: 每次启动都执行
      # - embedded: 只对嵌入式数据库( 如 H2、SQLite )执行
      # - never: 从不执行
      mode: ${DATABASE_INIT}
      # schema-locations: "classpath:schema-init.sql"
      data-locations: "classpath:data.sql"
  • 保持配置的简单性, 避免混合使用多种初始化方式, 清晰划分职责(表结构vs数据初始化)。如果需要同时使用 ddl-auto 和 sql.init,确保 sql.init 的脚本只包含数据初始化 ( data-locations: )(如 INSERT 语句),而不包含表结构定义(如 CREATE TABLE)。
  • 不同环境(开发、测试、生产)可能需要不同的初始化策略
  • 避免冲突, ddl-auto 和 sql.init ,一个负责表结构,一个负责数据初始化。

参考:


  1. @Entity注解的类将会初始化为一张数据库表 ↩︎

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐