<!-- markdown -->

# 目次
[TOC]

# JHipsterをつかうときの心構え
たとえていうならば、ちょっと故障しているジャンクの中古品を安く仕入れて、自分で修理するみたいな心構えが必要である。

生成されるコードは99.9%大丈夫だが、0.1%を治す必要があるという意味だ。

テーブル名のつけ方や、サロゲートキーを使った設計にするなど、自動生成に親和性の高い設計を心がける必要がある。

# JHipster7のインストールの注意点
nodeのインストールはちょっと前のバージョンにする

JHIPSTERは、最新だからnodeも最新で動くというわけではないようだ。

## 動作確認されたバージョンを使う
nodeは16

jhipsterは7.9.3を使う

### ちなみに(2022/11/07の最新を使おうとしたら)どうなるかというと
最新の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

### この問題はIssueに上がっている
https://github.com/jhipster/generator-jhipster/issues/19627

# mvnwはgit for bashではなくcmdから動かす
なぜかwindowsでは、クラスが見つからないエラーとなってしまうようだ。

bash for windowsで動かすには、

    mvnw.cmd
のほうをつかうと動く

# 生成したコードをSTSで読み込む

まずはpom.xmlファイルをインポートさせる。

## pomファイルの
以下の箇所でJavaのバージョン11が指定されているので、17にしておこう。
    <java.version>11</java.version>

# 複合のユニークキー
JDLからエンティティ生成すると、oneToManyの指定を行うとliquibaseのchangeLogにユニーク制約が入るが、複合してユニークとしたい場合、今のところ手動で微調整するしかないのか調査中

## 手順
uniqueConstraintNameの値を複合キーとしたいカラムがあれば、同じにする。

その他の修正が必要なのかわからないが以下のことをやっているユーザがいる

### 参考URL
https://stackoverflow.com/questions/36943627/how-to-add-unique-constraint-to-an-entity-in-jhipster

### JPAの複合キーについての記述
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>*]
の箇所になると思うが、将来的な実装されるといいな、という感じだ。

## JHipsterで複合ユニークキーを実現するにはどうするのかのまとめ

### src/main/resources/config/liquibase のChangeLogの修正

例えば、こんな感じにcolumnNamesにカンマ区切りを入れる
    <addUniqueConstraint tableName="airplane_model_seat" columnNames="seat_no, model_id_id"/>

### 関連するJPAアノテーションをEntityに追加する

こんな感じ、
    @Table(name = "table_name",
       uniqueConstraints = {@UniqueConstraint(columnNames = {"field_1", "field_2"})})

複合キーになりそうな定義を、ChangeLogの
    ux_
の文字列で検索しておいて、その検索結果をみながら、

下記の文字列
    @Table(name =
で検索して、修正をしていくといいかもしれない。

### フィールド値が一意であることの指定をJPAに対して確認する

    @Column(unique=true)
    String username; 

### フィールド値が一意であることの指定をLiquibaseのChangeLogに対して行う

    <column name="username" type="varchar(255)">
       <constraints nullable="true" unique="true" />
    </column>

# liquibaseのChangeLogを修正したらどうなるかの実験
すでにDBのliquibaseが管理しているdatabasechangelogテーブルに、反映したChangeLogの一覧があるが、それ自体を修正したので削除したい。

dropAllして、updateすればいけるのかどうか。。。

# 開発初期段階での手順

## DBの中身をバックアップとる
スキーマを捨ててsrc/main/resources/config/liquibaseのxmlで再構築する

残しておきたいデータがあればバックアップを取ればいいけど、自分は、

    src\main\resources\config\liquibase\fake-data

のディレクトリのCSVを修正している

### マスタテーブルの設定方法
データが決まってきたら、文字列の
    
    fake-data

で検索すると修正箇所がでてくるので、fake-dataから、dataフォルダに移してあげましょう。

## スキーマーを丸ごと消す(dropする)
    ./mvnw.cmd liquibase:dropAll -Dliquibase.username=root

これでpomファイルで定義してあるプロジェクトのスキーマがdropされます。

## 修正したxmlをもとにDBのテーブルを再構築
    ./mvnw.cmd liquibase:update -Dliquibase.username=root

csvで定義したfake-dataも投入されています。

## 生成されるfake-dataとChangeLogの修正

外部キー制約に引っかからないように、fake-dataは、該当のカラムのデータが入らないようになっている。

自分で修正すると、今度はデータを取り込む順序を間違えるとデータが入らないようになってしまう。

以下のファイルに記載してあるテーブルの作成順序を変えてみよう。マスターテーブルのxmlが上に来るようにすると作成順序が変わっていいかもしれない。

    src\main\resources\config\liquibase\master.xml

# pomファイルのJDBCの依存関係の追加
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>

# JavaのIDEでブレークポイントを立てる方法
pomファイルでHikariConfig class loader
のあるところに、mariaDBの依存があることを追記する必要があるようだ。

ApplicationWebXml.javaと同じフォルダにある、プロジェクト全体を動作させるjavaファイルがあるが、それをデバッグモードでSpring bootとして起動する。

# フロント側でブレークポイントを立てる

chromeの開発モードでブレークポイントたてれるのがわかったのですが、

以下のやり方はうまくいかなかった。

次にフロント側は

    npm startとすると9000番のポートを使って動作し、そこでの操作がバックエンドに伝わったときに、IDEでブレークポイントで止めることができるのだが、

vscodeで以下のURLを参考に指定をする

https://fintan.jp/page/462/

## sourceMapPathOverrides と webrootの変数の説明
https://qiita.com/beeeyan/items/9b0def365d64d11a4a1c

### その他
下記ページのChrome Debugger extention必須は、すでにVSCodeに組み込まれているから不要となっている
https://create-react-app.dev/docs/setting-up-your-editor/#visual-studio-code

# 注意点
## .hipsterの下のエンティティでの注意点
- idは自動でフィールド名に入るので入れない
- フィールド名はキャメル形式にする

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   最終更新のRSS