メインコンテンツまでスキップ

JHipsterドメイン言語(JDL) - リレーションシップ

概要

  1. リレーションシップの種類
  2. リレーションシップのメソッド
  3. 複数のリレーションシップのボディ
  4. 構文
    1. 基本の例
    2. 注入フィールド
    3. 結合フィールド
    4. メソッド
    5. オプションの使用
    6. 必須のサイド
    7. 再帰リレーションシップ
    8. コメント

リレーションシップの種類

キーワードrelationshipの後に記述されます。

次の4つのリレーションシップタイプがあります。

  • OneToOne
  • OneToMany
  • ManyToOne
  • ManyToMany

リレーションシップについてと何を達成できるかについてもっと知りたい場合は 専用ページを参照ください。

名前を複数形にすることに関する注意:JHipsterはそれらを処理するので、リレーションシップの中で処理する必要はありません。

リレーションシップのメソッド

元のエンティティと先のエンティティの後に記述され、withキーワードとともに使用されます。

サポートされているメソッドは以下です。

  • Authority:宛先エンティティがUserbuiltInEntityのような組み込みエンティティである場合に必要です

  • builtInEntity: required when the destination entity is a built in entity like User and Authority

複数のリレーションシップのボディ

JDLファイルに同じタイプの n 個のリレーションシップがあることにうんざりしている場合でも、心配する必要はありません。解決策はあります。

例えば、次のJDLサンプルを見てください。

relationship OneToOne {
A to B
}
relationship OneToOne {
B to C
}
relationship OneToOne {
C to D
}
relationship OneToOne {
D to A
}

解決策として、次のように、リレーションシップ宣言内にすべてのリレーションシップ本体を含めることができます。

relationship OneToOne {
A to B,
B to C,
C to D,
D to A
}

この構文は、次の場合に非常に役立ちます。

  • 同じタイプのリレーションシップをたくさん持っている場合

  • どのようなリレーションシップがあるかを知りたい場合

  • JDLファイルでそれらを探すために時間を無駄にしたくない場合

  • You have lots of relationships of the same type,

  • You want to know what the relationships are,

  • You don't want to waste time looking for them in your JDL file(s)

構文

リレーションシップの宣言は次のように行われます。

relationship (OneToMany | ManyToOne | OneToOne | ManyToMany) {
@<option>("<option value>")+ <from entity>[{<relationship name>[(<display field>)]}] to @<option>("<option value>")+ <to entity>[{<relationship name>[(<display field>)]}]+
}
  • (OneToMany | ManyToOne| OneToOne | ManyToMany)はリレーションシップのタイプです。
  • <option>は次の値の1つを指定します: Id | OnDelete | OnUpdate。これをリレーションシップの正しい側に置くようにしてください。最初の文字の大文字と小文字は区別されません(jdlのエクスポート時は大文字が生成されます)。
  • <option value> はオプションに適合する値の1つを指定します。 NO ACTION | RESTRICT | CASCADE | SET NULL | SET DEFAULT
  • <from entity>は、リレーションシップのエンティティの所有者の名前です:いわゆる「元」です。
  • <to entity>は、リレーションシップの先となるエンティティの名前です:いわゆる「先」です。
  • <relationship name>は、もう一方の端をタイプとするフィールドの名前です。
  • <display field>は、選択ボックスに表示されるフィールドの名前です(デフォルト:id)。
  • required注入されたフィールドが必須かどうか。
  • with builtInEntityは、関係の宛先が組み込みエンティティーかどうか。
  • 複数のリレーションシップ主体を持つことができます。

基本の例

relationship OneToOne {
A to B
}

この例は以下の例と同じです。

relationship OneToOne {
A{b} to B{a}
}

注入されたフィールドを指定しないことで、短い形式で双方向のリレーションシップを持たせます。

別の例です。

relationship OneToOne {
A{b} to B
}

これにより、単一方向のリレーションシップが生成されます。エンティティBはエンティティAを介してのみ探索できますが、エンティティAはエンティティBを介して探索できません。


注入フィールド

relationship ManyToMany {
A{b} to B{a}
}

これは双方向のリレーションシップです。つまり、両方のエンティティがもう一方のエンティティの「インスタンス」を持って 生成されます。



メソッド

relationship OneToOne {
A to User with builtInEntity
}

オプションの使用

relationship ManyToOne {
A to @OnDelete("SET NULL") @OnUpdate("CASCADE") B
}

Note:

In Hibernate/JPA, deleting a parent entity in a many-to-one relationship with child entities depends on the relationship configuration and cascading behavior.

Cascading Delete: When enabled, deleting the parent automatically deletes its associated children. This is achieved using CascadeType.REMOVE in the @OneToMany annotation on the parent entity class.

@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private List<ChildEntity> children;

No Cascading Delete: If not enabled, deleting a parent with children will result in a foreign key constraint violation. You must manually remove or disassociate the children before deleting the parent. Use cascading delete with caution as it can lead to unintended data loss.

Alternative for Preventing Delete Error: Use the @OnDelete annotation in JDL which will configure the database schema for cascading delete or add cascade = CascadeType.REMOVE to the generated Java code (if applicable).

必須のサイド

少なくとも1つのリレーションシップサイドを必須にするために使用します。

relationship ManyToMany {
A{b required} to B{a}
}

// または

relationship ManyToMany {
A{b} to B{a required}
}

または

relationship ManyToMany {
A{b(name) required} to B{a required}
}

再帰リレーションシップ

再帰リレーションシップは、元と先のエンティティが同じリレーションシップです。

relationship ManyToMany {
A{parent} to A{child}
}

必須な再帰リレーションシップに関する注意

ここで指摘されているように、同じエンティティとの必須なリレーションシップ はサポートされていません。必須とは、子は常に親を持たなければならず、親も常に親を持たなければならない、といったことです。 可能な回避策は、明示的なルートおよび子エンティティを持つことです。


コメント

リレーションシップにコメントを追加できます。

relationship OneToOne {
/** このコメントはエンティティAのbの前に置かれます*/
A{b}
to
/** このコメントはエンティティBのaの前に置かれます*/
B{a}
}

ここでもこれまでと同じコメント規則が適用されます。 これらのコメントは、後でJHipsterによってJavadocコメントとして追加されます。JDLには独自のコメントがあります。

  • // 無視されるコメント
  • /** 無視されるコメントではありません */

したがって、//で始まるものはすべてJDLの内部コメントと見なされ、Javadocとしてカウントされません。 #で始まるJDL Studioディレクティブは、構文解析中に無視されることに注意してください。