u-ryo's blog

various information for coding...

Category: Database

Adding a New Column on JHipster

| Comments

JHipsterでdatabaseのtableに新しいcolumnを足したいと思いました。 Liquibaseで管理されているので、直接DBを変えちゃうと立ち上がらなくなっちゃいます。 結構面倒臭いんですよねLiquibase。

基本的にはUsing JHipster in developmentのDatabase updatesに書いてある通り、です。 3通り紹介されていますが、最初に書かれているentity sub-generatorを使った方が、testやi18n、angular側の面倒も見てくれるので楽です。 但し、generateされるjava/json/ts filesについては、面倒でも一つ一つdiffを見て上書きするか考えた方がいいです。場合によっては上書きしない方がいいcaseもありました(repository class、即ちDBを直接叩くclassとかresource class、即ちRest Controllerとか、i18nのglobal.jsonとか、独自に書いたところがあるものは特に)。

新規にtableごと加える時はこれでいいのかもしれません(以前やってうまく行った薄い記憶がありますがよく覚えてません)。 けれども、既存tableにcolumnを足す、となると、 年月日_changelog.xmlを作ってくれないので、 いくらgradleかけてもDBのtableを変更してくれないんです。 更に、checksumが合わないといって起動しなくなります。 困ります。

なので、2番目の策を合わせてchangelog.xmlを作ってもらいます。 そのためには上記ページに書いてあるように、一旦buildしてからgradle liquibaseDiffChangelog -PrunList=diffLogすると、 class fileのdiffを取ってsrc/main/resources/config/liquibase/changelog/以下にchangelogを作ってくれます。 それをsrc/main/resources/config/liquibase/master.xmlに手で書き入れてからbuildすると、changelogが働いてalter tableしてくれます。 但しその際、元のtableのxml(年月日_added_entity_テーブル名.xml)をもとに戻しておかないと、「checksumが合わない」と言われるでしょう。

...というように、1番目と2番目の合わせ技的なところが最良のように思います。

どうしてもうまく行かない時、最後は以下の手で何とかなります。なりました。

  • DBは自分でalter table
  • checksumはDATABASECHANGELOG.MD5CHECKSUMにあるので自分でupdate table set ...