[JPA緊急学習(7)]アプリケーションプロジェクターの状況


カフェプロジェクトでは、データ構造は以下の通りです.
既存のユーザーとコーヒーテーブルだけが独立している場合、コメント、廃棄物、調査が追加されました.関連関係を適用しましょう.

マルチペアアプリケーション


(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の問題は発生しないと推定される.
(自分の目で確認する必要があります)