[Spring Boot2][1] 8. エージェントとの関連付けの処理


🏷 プロキシサーバ


どうしてこれを使うの?🤔❓
・𐥌¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
単独で出力したい場合は、どうすればいいですか?

勘定科目のプロキシインフラストラクチャ

  • em.find() vs em.getReference()
  • em.find():実際のエンティティ・オブジェクトをデータベースで問い合わせる
  • em.getReference():データベース照会を遅らせる偽(エージェント)エンティティオブジェクト照会

  • 勘定科目のプロキシフィーチャー


  • 実績レベル継承
  • 実レベルと同じ外観
  • 使用する立場では、実在するオブジェクトか代理オブジェクトかを区別せずに使用できる(理論上)
  • エージェントは実オブジェクトの参照を保持(target)
  • エージェントオブジェクトを呼び出すと、エージェントオブジェクトが実際のオブジェクトを呼び出す方法
  • ✔勘定科目エージェントオブジェクトの初期化

    Member member = em.getReference(Member.class, “id1”); 
    member.getName();
  • 当初メンバーtargetに値がないため、JPAは真のメンバーオブジェクトを永続コンテキストにインポートするよう要求する(=初期化)!
  • 永続性コンテキスト実オブジェクトの検索とインポート
  • リアルオブジェクトをメンバーターゲットに接続
  • 勘定科目の勘定科目プロキシの定理

  • エージェントオブジェクトを初めて使用した場合は1回のみ初期化
    ¥¥¥¥¥¥
  • エージェントオブジェクトを初期化すると、エージェントオブジェクトは実エンティティになりません!
    初期化すると、プロキシオブジェクトから実際のエンティティにアクセスできます.
  • エージェントは元のエンティティを継承するので、タイプチェックの際に注意(==instance ofではなく比較に失敗)
  • 検索するエンティティが永続コンテキストに既に存在する場合は呼び出し可能em.getReference()実際のエンティティに戻る
  • 永続性コンテキストヘルプのない準永続状態でエージェントを初期化中に問題が発生
    ЙЙЙЙЙЙЙЙЙЙЙЙЙЙ

    🏷 即時ロードと遅延ロード


    1」ディレイロード


    🤔 : さっき言ったようにメンバーを問い合わせるときにチーム以外にメンバーだけを問い合わせることはできないのでしょうか?
    だからJPAは遅延ロードオプションを提供します
    ディレイロード
    @Entity
    public class Member {
    	@Id 
    	@GeneratedValue
    	private String name;
        
    	@Column(name = "USERNAME")
    	private String name;
        
    	@ManyToOne(fetch = FetchType.LAZY) //**
    	@JoinColumn(name = "TEAM_ID")
    	private Team team;
    	..
    }
    org.hibernate.LazyInitializationExceptionАААААААААААААА

    member 1をロードするとteam 1が遅延ロードに設定されるので、エージェントをインポートできます!
    ✔代理クエリーとして遅延ロードLAZYを使用

    チームが遅延ロードに設定されている場合、偽エージェントが受信されます.
    АААААААААААААААА

    即時ロード2」


    🤔 : チームがメンバーと一緒に使うなら?
    ロードされたEAGERをすぐに使用
    ✔即時ロード
    @Entity
    public class Member {
    	@Id
    	@GeneratedValue
    	private String name;
        
    	@Column(name = "USERNAME")
    	private String name;
        
    	@ManyToOne(fetch = FetchType.EAGER) //**
    	@JoinColumn(name = "TEAM_ID")
    	private Team team;
    	..
    }
    @ManyToOne(fetch = FetchType.LAZY)ААААААААААААААА\1040

    ロードが完了したら、一緒にチームを組んで持ってきてください.
    ¥JPAインプリメンテーションは可能な限り連結を使用してSQLを検索します!
    ✔¥エージェントと即時ロードの注意
  • 可能な限り遅延ロードを使用する(特に実際の動作中!)
  • 思わぬSQLがすぐにロードされる
  • 直ちにJPQLにロードしてN+1問題を引き起こす
  • em.find() , @ManyToOne(fetch = FetchType.EAGER) 은 기본이 즉시 로딩 ➡️ LAZY로 설정
  • @ManyToOne@OneToOne基本的にディレイロード
  • 3遅延負荷の利用


    ・𐂍𐂍・𐂊」「「よく一緒に使う」すぐにロード・
    ・𐂍𐂍・𐂊」」」」」」」」」
    ・𐂍𐂍・𐂊」「「「」を常に一緒に使う」即ロード
    ¥2これは実は理論上の内容で、・ʦ8・
    実際の操作では、遅延ロードをすべて使用するだけで済みます.
    勘定科目JPQL fetch結合、またはエンティティグラフィックス機能を使用します(後述)

    🏷 永続性遷移(CASCADE)と孤立オブジェクト


    ✔朕霊属性戦


  • 特定のエンティティを永続状態にした場合、関連するエンティティを永続状態にした場合にも使用可能!
  • 例えば、親エンティティを保存する場合、子エンティティも一緒に保存する
  • @OneToMany
  • に注意🤚🏻
  • 永続的な移行はマッピング関連関係とは何の関係もありません!
  • エンティティが永続する場合、関連するエンティティも永続する便利さを提供します!
  • ✔CASCADのタイプ

  • @ManyToMany:全て適用
    ЙЙЙЙЙ8ЙЙ
  • Member:永続
    ¥¥¥8¥¥
  • Team:削除
  • Member:合併
  • Order : REFRESH
  • Order : DETACH
  • 📌 リファレンス
  • 1人の親が複数の子供を管理するときに使うのが意味がある!
    例えば、掲示板、添付ファイルの表データ等

    ✔✔上品なオブジェクト

  • 孤児除外対象:親エンティティに関連付けられていない子エンティティを自動的に削除する機能!
  • Product
  • @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)
  • Parent parent1 = em.find(Parent.class, id); 
    parent1.getChildren().remove(0);
    アセンブリからサブエンティティを除去するには
    に注意🤚🏻
  • 参照したエンティティを削除して他の場所で参照しない孤立オブジェクトと見なす機能
  • 参考までの場所が1つしかない場合に使う!
  • 特定エンティティ専用
  • ALLPERSIST限定
  • 📌 リファレンス
  • 概念的には親を除けば子供は孤児になる
  • そのため、孤児対象を取り除く機能を有効にすると、親を取り除く際に子どもも一緒に取り除かれる!
  • これはREMOVEと同じ動作
  • ✔¥霊性殿+孤児対象、ライフサイクル

  • MERGE
  • 自己管理ライフサイクルのエンティティREFRESH羅永続化DETACH羅消去
  • 2つのオプションをアクティブにすると、親エンティティで子どものライフサイクルを管理できる
  • ドメイン主導設計(DDD)の集約ルーティング概念を実施する際に非常に有用
  • 🏷 実戦例5-関連管理


    ✔▼設定を追加


    📌 グローバルバッチ・ポリシーの設定
    1朕はすべての関連関係を遅延ロードに設定する
    2▼▼、▼、▼▼、▼▼▼▼、▼▼▼▼4、▼▼▼▼
    📌 永続的な移行設定
    1”Order”Delivery,永久性全ALL設定
    2””Order”OrderItem,永久性全ALL

    勘定科目


    1朕グローバル配置戦略設置

    @ManyToOne(fetch = LAZY)
    @OneToOne(fetch = LAZY)
    ¥¥

    2▞▞永久的な移行の設定

    @OneToOne(fetch = LAZY, cascade = ALL)
    @JoinColumn(name = "DELIVERY_ID")
    private Delivery delivery;
    
    @OneToMany(mappedBy = "order", cascade = ALL)
    private List<OrderItem> orderItems = new ArrayList<>();
    ¥¥
    いい内容だった