スケのブログ

Java, Java EE, OpenAMなどの情報を記述していきます。

Stackoverflowの「Difference between FetchType LAZY and EAGER in Java Persistence API?」を翻訳

質問

JPAHibernateの初心者です。
JPAの FetchType.LAZY と FetchType.EAGER の違いは何でしょうか?

回答

2つのエンティティがあり、それらが互いに関連しているとしましょう。
例えば、一つがUnivertityというエンティティ、もう一つはStudentとしましょう。

Unibersityエンティティはid,name,addressやstudentsと呼ばれるプロパティなどの基本的なプロパティを持っています。

public class University {
 private String id;
 private String name;
 private String address;
 private List<Student> students;

 // setters and getters
}

あなたは今、DBからUniversityを取得します。JPAはid,name,addressを取得します。しかし、studentsプロパティの取得に関しては2つの選択肢があります。他のフィールドと一緒に取得する方法(すなわち、eagerly)と、UniversityエンティティのgetStudents()が呼ばれた時に、要求があった時に取得を行う方法(すなわち、lazily)です。

Universityがstudentsを呼び出すとき、そのstudentsが必要とされていないならば、全てのstudentsを呼び出すのは非効率的です。
従ってこのようなケースでは、studentsが必要とされた場合に、studentsを取得するようにするべきです。これをlazy loadingといいます。