[JPA緊急学習(7)]アプリケーションプロジェクターの状況
3373 ワード
カフェプロジェクトでは、データ構造は以下の通りです.
既存のユーザーとコーヒーテーブルだけが独立している場合、コメント、廃棄物、調査が追加されました.関連関係を適用しましょう.
reviw、廃棄物、調査は、ユーザー、cafe、多対一の一方向関係に適用できます.
将来の拡張性の観点から、このケースが最も理想的です.たとえば、scarpやsurveyでは、将来のタイムスタンプなどのフィールドが追加される場合があります.
複数対1の一方向の場合、Scrap Entityは次のように定義されます.
この場合、廃品と調査しかできません.reviewはキー以外にも他のフィールドが存在するため、実行できません.
次の例では、2つのデフォルト鍵user idとcafe idがあります.
また、廃品や調査では、
廃棄物の場合、テーブルはDB上に存在するが、JavaコードのEntityとしては存在しない.
@JoinTable.name:接続テーブルを指定します.例では廃品になります.
@JoinTable.joinColumns:接続テーブルと定義エンティティ(user)をマッピングする結合バーを指定します.例は、廃棄テーブルのuser idになります.
@JoinTable.逆Columns:接続テーブル、エンティティ基準相対(cafe)の定義、および入力する結合バーを指定します.例では、テーブルを廃棄するcafeidです.
まず、2回のクエリ文のロードを遅延し、すぐに1回のクエリ文(結合)をロードします.
プロジェクトの場合、実際には、廃棄物やレビューであれば、廃棄物を検索する瞬間にuser&reviewは同じ時点で必要です.
したがって、ロードを遅らせる必要はありません.
放っておけばいい.ManyToOneでデバッガはEAGER
しかし、すぐにロードするときはN+1問題を正しく学ぶ必要があります★★★★
また、遅延ロード+fetch結合も発生します.
廃棄物Entityをクエリーする場合、ユーザーidとcafeidの2つのクエリー結果は1つのレコードしかありません.
また,廃棄物エンティティ内部には集合は存在しない.
したがって,直ちにロードしてもN+1の問題は発生しないと推定される.
(自分の目で確認する必要があります)
既存のユーザーとコーヒーテーブルだけが独立している場合、コメント、廃棄物、調査が追加されました.関連関係を適用しましょう.
マルチペアアプリケーション
(1)エンティティの定義
reviw、廃棄物、調査は、ユーザー、cafe、多対一の一方向関係に適用できます.
将来の拡張性の観点から、このケースが最も理想的です.たとえば、scarpやsurveyでは、将来のタイムスタンプなどのフィールドが追加される場合があります.
複数対1の一方向の場合、Scrap Entityは次のように定義されます.
@Entity
@Table(name="scrap") // name 생략 가능
public class Scarp {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@JoinColumn(name = "cafe_id")
private Cafe cafe;
}
(2) Entity Read
String jpql = "select u from user u join .
(3) Entity Write
多対多適用
(1)エンティティの定義
この場合、廃品と調査しかできません.reviewはキー以外にも他のフィールドが存在するため、実行できません.
次の例では、2つのデフォルト鍵user idとcafe idがあります.
また、廃品や調査では、
i)一方向関係-ユーザー参照のみ許可
廃棄物の場合、テーブルはDB上に存在するが、JavaコードのEntityとしては存在しない.
@Entity
@Table
public class User {
@Id
@Column
private String user_id;
@Column
private String nickName;
@Column
private String email;
@Column
private String age;
@Column(name="profile_image_url")
private String imgUrl;
@Column
private String gender;
@ManyToMany
@JoinTable(name = "scrap",
joinColumns = @JoinColumn(name="user_id"),
iverseJoinColumns = @JoinColumn(name="cafe_id"))
private List<Cafe> cafeList = new ArrayList<Cafe>();
}
###@JoinTableプロパティクリーンアップ###@JoinTable.name:接続テーブルを指定します.例では廃品になります.
@JoinTable.joinColumns:接続テーブルと定義エンティティ(user)をマッピングする結合バーを指定します.例は、廃棄テーブルのuser idになります.
@JoinTable.逆Columns:接続テーブル、エンティティ基準相対(cafe)の定義、および入力する結合バーを指定します.例では、テーブルを廃棄するcafeidです.
ii)双方向関係-両方のオブジェクトが相対オブジェクトを参照できる
@Entity
@Table
public class Cafe {
@Id
private String cafe_id;
@ManyToMany(mappedBy = "cafeList") // 주인은 user
private List<User> users;
}
次に、User Entityに次の関連記事を追加します.public void addCafe(Cafe cafe) {
cafeList.add(cafe);
cafe.getUsers().add(this);
}
今はお互いに相手を知ることができます.即時ロードと遅延ロード
まず、2回のクエリ文のロードを遅延し、すぐに1回のクエリ文(結合)をロードします.
プロジェクトの場合、実際には、廃棄物やレビューであれば、廃棄物を検索する瞬間にuser&reviewは同じ時点で必要です.
したがって、ロードを遅らせる必要はありません.
放っておけばいい.ManyToOneでデバッガはEAGER
しかし、すぐにロードするときはN+1問題を正しく学ぶ必要があります★★★★
また、遅延ロード+fetch結合も発生します.
廃棄物Entityをクエリーする場合、ユーザーidとcafeidの2つのクエリー結果は1つのレコードしかありません.
また,廃棄物エンティティ内部には集合は存在しない.
したがって,直ちにロードしてもN+1の問題は発生しないと推定される.
(自分の目で確認する必要があります)
Reference
この問題について([JPA緊急学習(7)]アプリケーションプロジェクターの状況), 我々は、より多くの情報をここで見つけました https://velog.io/@red_gunny/JPA-긴급학습-7-플젝-상황-적용テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol