nodeのインストールはちょっと前のバージョンにする
JHIPSTERは、最新だからnodeも最新で動くというわけではないようだ。
nodeは16
jhipsterは7.9.3を使う
最新のバージョンをつかおうとしたら、以下のエラーが出る Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './lib/util/namespace' is not defined by "exports" in C:\Users\sion3\AppData?\Roaming\npm\node_modules\generator-jhipster\node_modules\yeoman-environment\package.json
https://github.com/jhipster/generator-jhipster/issues/19627
なぜかwindowsでは、クラスが見つからないエラーとなってしまうようだ。
bash for windowsで動かすには、
mvnw.cmd
のほうをつかうと動く
まずはpom.xmlファイルをインポートさせる。
以下の箇所でJavaのバージョン11が指定されているので、17にしておこう。
<java.version>11</java.version>
JDLからエンティティ生成すると、oneToMany?の指定を行うとliquibaseのchangeLogにユニーク制約が入るが、複合してユニークとしたい場合、今のところ手動で微調整するしかないのか調査中
uniqueConstraintName?の値を複合キーとしたいカラムがあれば、同じにする。
その他の修正が必要なのかわからないが以下のことをやっているユーザがいる
https://stackoverflow.com/questions/36943627/how-to-add-unique-constraint-to-an-entity-in-jhipster
https://stackoverflow.com/questions/3404853/multiple-unique-constraints-in-jpa
によれば、以下の文法が使えるようだ。ただ、Hibernateが対応してなさげみたいなコメントもあるので留意しよう。
@Entity @Table(name="person", uniqueConstraints={ @UniqueConstraint(columnNames={"code", "uid"}), @UniqueConstraint(columnNames={"anotherField", "uid"}) }) public class Person { // Unique on code and uid public String code; public String uid; // Unique on username public String username; public String name; public String email; }
1フィールドのユニーク制約は、フィールドレベルだけれども、複合フィールドのユニーク制約は、テーブルレベルの指定だ。
JDLの書式は、
https://www.jhipster.tech/jdl/entities-fields
によれば、
[<entity javadoc>] [<entity annotation>*] entity <entity name> [(<table name>)] { [<field javadoc>] [<field annotation>*] <field name> <field type> [<validation>*] }
なので、もしJDLに記述できるとすれば、
[<entity annotation>*]
の箇所になると思うが、将来的な実装されるといいな、という感じだ。
例えば、こんな感じにcolumnNamesにカンマ区切りを入れる
<addUniqueConstraint tableName="airplane_model_seat" columnNames="seat_no, model_id_id"/>
こんな感じ、
@Table(name = "table_name", uniqueConstraints = {@UniqueConstraint(columnNames = {"field_1", "field_2"})})
@Column(unique=true) String username;
<column name="username" type="varchar(255)"> <constraints nullable="true" unique="true" /> </column>
すでにDBのliquibaseが管理しているdatabasechangelogテーブルに、反映したChangeLog?の一覧があるが、それ自体を修正したので削除したい。
dropAllして、updateすればいけるのかどうか。。。
スキーマを捨ててsrc/main/resources/config/liquibaseのxmlで再構築する
残しておきたいデータがあればバックアップを取ればいいけど、自分は、
src\main\resources\config\liquibase\fake-data
のディレクトリのCSVを修正している
データが決まってきたら、文字列の
fake-data
で検索すると修正箇所がでてくるので、fake-dataから、dataフォルダに移してあげましょう。
./mvnw.cmd liquibase:dropAll -Dliquibase.username=root
これでpomファイルで定義してあるプロジェクトのスキーマがdropされます。
./mvnw.cmd liquibase:update -Dliquibase.username=root
csvで定義したfake-dataも投入されています。
外部キー制約に引っかからないように、fake-dataは、該当のカラムのデータが入らないようになっている。
自分で修正すると、今度はデータを取り込む順序を間違えるとデータが入らないようになってしまう。
以下のファイルに記載してあるテーブルの作成順序を変えてみよう。マスターテーブルのxmlが上に来るようにすると作成順序が変わっていいかもしれない。
src\main\resources\config\liquibase\master.xml