You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中使用Liquibase无法填充数据库测试数据的问题

解决Liquibase插入数据不生效的问题

看起来你遇到的核心问题是Hibernate的DDL自动创建操作覆盖了Liquibase插入的数据,我来帮你一步步分析和解决:

问题根源

你的Spring JPA配置中设置了spring.jpa.hibernate.ddl-auto=create,这个配置会在应用启动时删除所有现有表并重新创建。而默认情况下,Liquibase的迁移脚本执行是在Hibernate的DDL生成之前的——也就是说:

  1. Liquibase先执行了insert-books.sql,把数据插入到了当时存在的表中
  2. 随后Hibernate执行了create操作,删掉并重建了所有表,之前插入的数据自然就没了
    这就是为什么你能看到迁移记录,但数据库里没有数据的原因。

解决方案

这里有两种可行的解决思路,你可以根据自己的需求选择:

方案一:调整JPA的DDL配置(推荐)

既然你已经用Spring Data JPA生成schema,用Liquibase填充测试数据,那完全可以让Hibernate不再重建表,只做schema验证或者不干预。修改application.properties中的JPA配置:

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=validate
  • validate:Hibernate只会验证实体类和数据库schema是否匹配,不会修改表结构
  • 如果不想做验证,也可以把ddl-auto改成none,彻底关闭Hibernate的自动DDL操作

这样调整后,Hibernate不会再重建表,Liquibase插入的数据就能保留在数据库中。

方案二:延迟Liquibase执行顺序(适合必须保留ddl-auto=create的场景)

如果你因为某些原因必须保留spring.jpa.hibernate.ddl-auto=create,可以通过配置让Liquibase在Hibernate完成表创建之后再执行。在application.properties中添加以下配置:

spring.liquibase.defer-datasource-initialization=true
spring.sql.init.mode=always

这个配置会延迟数据源的初始化流程,确保Hibernate先完成表的创建,再执行Liquibase的迁移脚本。

额外注意事项

  • 你的insert-books.sql中的delete from book;在ddl-auto=create的场景下其实没必要,因为Hibernate已经清空了表
  • 脚本里的commit;可以去掉,Liquibase会自动管理迁移事务,手动提交可能引发不必要的事务异常
  • 确保seq序列存在:如果你的Book实体用了@GeneratedValue(strategy=SEQUENCE),Hibernate会自动生成这个序列;如果没有,你可能需要在Liquibase的变更日志中先定义这个序列

修改配置后重启应用,就能看到book表中成功填充测试数据了。

内容的提问来源于stack exchange,提问作者Andronicus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:42:29