Spring Boot中使用Liquibase无法填充数据库测试数据的问题
解决Liquibase插入数据不生效的问题
看起来你遇到的核心问题是Hibernate的DDL自动创建操作覆盖了Liquibase插入的数据,我来帮你一步步分析和解决:
问题根源
你的Spring JPA配置中设置了spring.jpa.hibernate.ddl-auto=create,这个配置会在应用启动时删除所有现有表并重新创建。而默认情况下,Liquibase的迁移脚本执行是在Hibernate的DDL生成之前的——也就是说:
- Liquibase先执行了
insert-books.sql,把数据插入到了当时存在的表中 - 随后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
相关产品推荐
相关产品推荐

