不使用Flyway、Liquibase等框架,如何在Spring JPA中实现数据库迁移?
仅依托Spring Data JPA实现数据库迁移的可行方案
完全可以仅使用Spring JPA生态自带的能力实现数据库迁移,无需引入Flyway、Liquibase等第三方迁移框架,具体实现方式和注意事项如下:
核心实现能力
1. Hibernate原生DDL自动管理能力
Spring Data JPA默认使用Hibernate作为ORM实现,自带Schema自动同步能力,仅需通过配置项即可启用:
- 核心配置项:
spring.jpa.hibernate.ddl-auto,可选值说明:none:完全关闭DDL操作,不会对数据库结构做任何修改validate:仅启动时校验实体类和现有表结构的匹配性,不匹配则直接终止启动,适合生产环境做校验兜底update:启动时自动对比实体类与现有表结构差异,自动执行增量DDL操作(支持新增表、新增字段、新增索引等,默认不会删除旧字段/旧表避免数据丢失)create:每次启动都会删除所有现有表后重新创建,仅适合本地开发调试使用create-drop:启动时建表,程序停止运行时自动删除所有表,仅适合单元测试场景
2. 自定义SQL脚本自动执行能力
如果需要更可控的迁移逻辑,Spring JPA集成Spring Boot的SQL初始化能力支持自动执行自定义迁移脚本:
- 核心配置项:
spring.sql.init.mode,可选值为always(始终执行)、never(关闭执行)、embedded(仅对内存数据库执行) - 默认自动加载ClassPath下的
schema.sql(存放DDL迁移语句)和data.sql(存放DML数据初始化/迁移语句),也可通过spring.sql.init.schema-locations、spring.sql.init.data-locations自定义脚本路径 - 支持按环境区分脚本,配置
spring.sql.init.platform=prod后,会自动优先加载schema-prod.sql、data-prod.sql适配生产环境
生产环境使用注意事项
- 自行实现版本化控制:没有第三方框架的版本管控能力时,可自行创建一张极简的
schema_version表,存储已执行的脚本版本号,启动时先查询该表过滤已执行脚本,仅运行未入库的新脚本,执行完成后写入版本记录即可,整套逻辑仅需少量代码即可实现。 - 生产环境禁止直接使用
spring.jpa.hibernate.ddl-auto=update:自动生成的DDL逻辑不可控,可能出现不符合预期的结构修改甚至数据丢失,建议在测试环境开启update生成基础DDL,人工校验调整后写入自定义SQL脚本再上线。 - 复杂数据迁移单独处理:涉及字段类型转换、数据清洗、旧表数据迁移到新表等逻辑,必须手动编写SQL脚本实现,不要依赖自动DDL能力,上线前需在测试环境完成全量数据兼容性验证。
- 代码级迁移逻辑可通过启动事件实现:如果需要通过Java代码处理迁移逻辑(比如旧字段数据加密、跨表数据关联补全),可以在
@PostConstruct方法或ApplicationReadyEvent监听器中实现,执行前先判断迁移标记,避免重复执行。
如果你的项目Schema变动频率不高、迁移逻辑复杂度较低,这套方案完全可以满足生产使用需求,适配你无法引入第三方迁移框架的约束。
内容的提问来源于stack exchange,提问作者sparkstorm
相关产品推荐
相关产品推荐

