たとえていうならば、ちょっと故障しているジャンクの中古品を安く仕入れて、自分で修理するみたいな心構えが必要である。
生成されるコードは99.9%大丈夫だが、0.1%を治す必要があるという意味だ。
nodeのインストールはちょっと前のバージョンにする
JHIPSTERは、最新だからnodeも最新で動くというわけではないようだ。
nodeは16
jhipsterは7.9.3を使う
最新のnodeのバージョンをつかおうとしたら、以下のエラーが出る
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"})})
複合キーになりそうな定義を、ChangeLog?の
ux_
の文字列で検索しておいて、その検索結果をみながら、
下記の文字列
@Table(name =
で検索して、修正をしていくといいかもしれない。
@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
HikariCPが依存しているJDBCのdependencyが自動で追加されていないようなので、 以下を参考にして入れてあげる必要があった。
<dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency>
pomファイルでHikariConfig? class loader のあるところに、mariaDBの依存があることを追記する必要があるようだ。
ApplicationWebXml?.javaと同じフォルダにある、プロジェクト全体を動作させるjavaファイルがあるが、それをデバッグモードでSpring bootとして起動する。
chromeの開発モードでブレークポイントたてれるのがわかったのですが、
以下のやり方はうまくいかなかった。
次にフロント側は
npm startとすると9000番のポートを使って動作し、そこでの操作がバックエンドに伝わったときに、IDEでブレークポイントで止めることができるのだが、
vscodeで以下のURLを参考に指定をする
https://qiita.com/beeeyan/items/9b0def365d64d11a4a1c
下記ページのChrome Debugger extention必須は、すでにVSCodeに組み込まれているから不要となっている https://create-react-app.dev/docs/setting-up-your-editor/#visual-studio-code