リレーションシップ(以下「関係」と記載)の管理
JPAを使用すると、エンティティ・サブジェネレーターによってエンティティ間の関係を作成できます。
プレゼンテーション
関係は、JPAが使用されている場合にのみ機能します。Cassandraの使用を選択した場合は使用できません。MongoDB、Couchbase、またはNeo4jの関係を使用する場合、セマンティクスは異なります が、すべて使用できます。CouchbaseとMongoDBの関係の詳細については、CouchbaseとMongoDBの組込みエンティティを参照してください。
関係は2つのエンティティ間で機能し、JHipsterは次のコードを生成します。
- 生成されたエンティティでのJPAとの関係を管理します
- 関係がデータベースに存在するように、正しいLiquibase変更ログを作成します
- Angular/Reactフロントエンドを生成して、この関係をユーザインタフェースでグラフィカルに管理できるようにします
JHipster UMLとJDL Studio
このページでは、標準のコマンドライン・インタフェースを使用してJHipsterとの関係を作成する方法について説明します。多数のエンティティおよび関係を作成する場合は、グラフィカル・ツールを使用することをお薦めします。
この場合、次の3つのオプションを使用できます。
- JDL Studioは、ドメイン固有の言語を使用してエンティティと関係を作成するためのオンライン・ツールです。
- JHipster IDEは、よく使われるIDEのJDLファイルのテキスト編集サポートを提供するプラグインです。
- 非推奨:JHipster UMLでは、UMLエディタを使用できます。
jhipster jdl your-jdl-file.jh
を実行することにより、jdl
サブジェネレータを使用して、JDLファイルから関係を持つエンティティを生成できます。
使用可能な関係
JPAを使用すると、通常の1対多(one-to-many)、多対1(many-to-one)、多対多(many-to-many)、1対1(one-to-one)の関係が使用可能になります。
ヒント: User
エンティティ
これについての情報はここにあります。
エンティティと関係の生成に関する小さな警告:以下の例では、コンパイル時に 関係先のエンティティが生成されないために失敗することがありますが、これは正常なことです(この警告は無視できます)。 これを回避するには、次の2つの方法があります。
- 最初にエンティティを生成し、次に関係を生成します
- JDLを使用します
双方向の1対多の関係
「所有者(Owner
)」と「車(Car
)」という2つのエンティティから始めましょう。1人の所有者は複数の車を持つことができ、1台の車の所有者は1人だけです。
これは、一方の側では1対多の関係(1人の所有者が多くの車を所有)であり、もう一方の側では多対1の関係(多くの車が1人の所有者を所有)です。
Owner (1) <-----> (*) Car
エンティティの生成後、生成中にエラーが発生したことを知らせるメッセージが表示されます。 これは、参照先のエンティティがまだ生成されていないので、正常な動作です。したがって、この警告は無視してもかまいません。
最初にOwner
を作成します。Owner
に関連するJHipsterの質問は次のとおりです。
jhipster entity Owner ... Generating relationships to other entities(他のエンティティとの関係の生成) ? Do you want to add a relationship to another entity?(別のエンティティに関係を追加しますか?) Yes ? What is the name of the other entity?(他のエンティティの名前は何ですか?) Car ? What is the name of the relationship?(関係の名前は何ですか?) car ? What is the type of the relationship?(関係のタイプは何ですか) one-to-many ? What is the name of this relationship in the other entity?(他のエンティティにおけるこの関係の名前は何ですか) owner
関係の名前に関するデフォルトのオプションを選択したことに注意してください。
これでCar
を生成できます。
jhipster entity Car ... Generating relationships to other entities ? Do you want to add a relationship to another entity? Yes ? What is the name of the other entity? Owner ? What is the name of the relationship? owner ? What is the type of the relationship? many-to-one ? When you display this relationship with Angular, which field from 'Owner' do you want to use?(Angularでこの関係を表示する場合'Owner'のどのフィールドを使用しますか?) id
以下のJDLを使用しても同じことができます。
entity Owner
entity Car
relationship OneToMany {
Owner{car} to Car{owner}
}
これで、これら2つのエンティティ間に1対多の関係ができました! 生成されたAngular/ReactクライアントUIではCar
にドロップダウンが表示され、Owner
を選択できます。
双方向の多対1の関係
これは、JDLファイルの内容を反転した後の双方向の1対多の関係と同じです。
entity Owner
entity Car
relationship ManyToOne {
Car{owner} to Owner{car}
}
単一方向の多対1の関係
前の例では、双方向の関係がありました。Car
インスタンスからその所有者を見つけることができ、Owner
インスタンスからそのすべての車を取得できます。
多対1の一方向の関係は、車がその所有者を知っていることを意味しますが、その逆はありません。
Owner (1) <----- (*) Car
このような関係にする理由は2つあります。
- ビジネスの観点からは、この方法でのみエンティティを使用します。そのため、開発者に意味のない ことを実行させるAPIは必要ありません。
Owner
エンティティを使用する際に、パフォーマンスがわずかに向上します(Car
のコレクションを管理する必要がないため)。
その場合でも、最初にOwner
を作成し、今度は関係なしで作成します。
jhipster entity Owner
...
Generating relationships to other entities
? Do you want to add a relationship to another entity? No
次に、前の例のようにCar
エンティティを作成します。
jhipster entity Car
...
Generating relationships to other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Owner
? What is the name of the relationship? owner
? What is the type of the relationship? many-to-one
? When you display this relationship with Angular, which field from 'Owner' do you want to use? id
これは前の例と同じように動作しますが、Owner
エンティティから車を追加または削除はできません。生成されたAngular/ReactクライアントUIでは、Owner
を選択するためのドロップダウンがCar
にあります。
対応するJDLは以下のとおりです。
entity Owner
entity Car
relationship ManyToOne {
Car{owner} to Owner
}