【发布时间】:2020-03-29 17:31:03
【问题描述】:
我正在尝试使用 Monolith 和基于磁盘的 H2 数据库的 JHipster(版本 6.4.1)。我在 JDL 中创建了一些实体,并让基本的 CRUD 网页正常工作。现在我对这个过程感到满意,我想添加字段并重命名其他字段。我想我可以简单地更新 JDL,重新导入 JDL,启动应用程序,然后查看更改的结果。我看到的是来自 Liquibase 的 ValidationFailedException 以及由于数据库问题而引发 HTTP 500 错误的应用程序。
我已经到处寻找有关处理这种看似常见的开发场景的正确流程的指导。我寻找指导的大多数地方(例如https://www.jhipster.tech/creating-an-entity)都讨论了将 JDL 导入为一次性操作,而不讨论如何逐步更改和导入 JDL。
我尝试了一些在 SO 上看到的建议,例如不覆盖更改日志、执行 liquibase:diff 并将其添加到 master.xml。这仍然会导致ValidationFailedException。在master.xml 我看到<!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here --> 的评论让我相信JHipster 应该做繁重的工作,但我只是错过了一步。
我绝不是 JHipster 也不是 Liquibase 专家,但我想学习。如何执行简单的实体更新而不费力?
[更新更多细节]
在重新导入更新后的 JDL 后,我设法通过使用 rm -rf target/h2db/db 删除数据库来摆脱 DB 验证错误。
我对我的更改感到满意,并且觉得提交是有序的。我看到的是
-
master.xml不变 - 第一次 JDL 导入的变更日志已被修改以包含我所做的更新
如果我了解 liquibase 的工作原理,我会预料到
- 不会触及任何现有的变更日志
- 将创建一个全新的更改日志文件,其中仅包含我这一轮所做的 JDL 更改
-
master.xml的更改只是因为它将包含一个额外的更改日志条目,指向在第 2 项中创建的文件
我是否误解了 Liquibase 如何代表 DB 架构的演变?
【问题讨论】:
-
就我在过去几个月中一直在努力更新和升级、文档和课程方面的 JHipster 和 liquibase 集成而言,有时唯一的方法是编辑 master.xml 和其他更改日志 xml-包括您自己的初始文件(和添加新文件)的文件,如所述,例如在udemy.com/course/angular-4-java-developers/learn/lecture/…。如果实体及其关系没有“进化”而是(破坏性)变化,也许只有这种情况。我还认为 liquibase 会自动帮助不必总是删除我的数据。