ITと服と食と

洋服と食をこよなく愛するWebプログラマ。

Lazy/Eager Fetch

データベースへのクエリのタイミングを定義するとき、大きく分けて2つ方式がある。

  • Lazy Fetch:関連するコレクションをDBから呼びこまない。Persistentオブジェクトにコレクションを取得するメソッドが呼ばれたときにSQLを発行してDBからレコードを読み込む。都度問い合わせをする。
  • Eager Fetch:関連するコレクションをDBから読み込む。DBから該当のEntityだけでなく関連するEntityも全て読み込むので、DBへの問い合わせが1回で済む。

□Lazy

@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<OrderDetails> orderDetailses = new ArrayList<>();

□Eager

@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<OrderDetails> orderDetailses = new ArrayList<>();

□関連とFetchの設定
@OneToMany, @ManyToManyのデフォルトのFetch設定はLAZY
@ManyToOne, @OneToOneのデフォルトのFetch設定はEAGER

※Eager設定は、基本的にパフォーマンスのボトルネックとなるので、極力避ける