即時ロードと遅延ロード



リファレンス
  • 金英漢インフラ講座-Java ORM標準JPAプログラミング-基本編
  • Java ORM標準JPAプログラミング
  • メンバーを検索するときにチームを一緒に検索しますか?

  • メンバー情報のみを使用するビジネスロジック
    println(member.getName());

  • プロキシクエリとしてのLaZYの遅延ロード

    @Entity
    public class Member extends BaseEntity {
    
        @Id @GeneratedValue
        @Column(name = "MEMBER_ID")
        private Long id;
    
        @Column(name = "USERNAME")
        private String name;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "TEAM_ID")
        private Team team;
     }
  • Member member = em.find(Member.class, 1L);
  • Team team = member.getTeam();
  • team.getName();//実際のチームを使用する場合の初期化(DBクエリ)

  • 今すぐロードEAGERを使用してブラウズ

    @Entity
    public class Member extends BaseEntity {
    
        @Id @GeneratedValue
        @Column(name = "MEMBER_ID")
        private Long id;
    
        @Column(name = "USERNAME")
        private String name;
    
        @ManyToOne
        @JoinColumn(name = "TEAM_ID")
        private Team team;
    }

    インスタント・ロード(EAGER)メンバー・クエリー時に常にTeamを表示


  • JPAインプリメンテーションは、可能な限り1回のクエリ
  • を結合することを用いる.

    エージェントと即時ロードの注意事項

  • 遅延ロードのみ(特に実際の動作では)
  • .
  • すぐにロードすると、予期せぬSQL
  • が発生します.
  • が直ちにロードされると、JPQLでN+1の問題が発生します.
  • @ManyToOne,@OneToOneデフォルトはインスタントロード
    ->LAZY
  • に設定
  • @OneToMany,@ManyToManyデフォルトは遅延ロード
  • 遅延ロードの使用

  • メンバーは常にTeamと連携して使用->
  • をすぐにロード
    たまに
  • メンバーとオーダーを使用する->遅延ロード
  • オーダーは製品とよく一緒に使用されます->
  • をすぐにロードします.

    ビジネス

  • すべての関連関係で遅延ロードを使用!
  • ビジネスですぐにロードを使用しないでください.
  • JPQL fetch接続、またはエンティティグラフィックス機能を使用!(後述)
  • がすぐにロードするのは想像できないクエリーです.