1. ホーム
  2. java

[解決済み] Java Persistence APIにおけるFetchType LAZYとEAGERの違い?

2022-03-15 08:23:36

質問

私は、JavaのPersistence APIとHibernateの初心者です。

とはどのような違いがあるのでしょうか? FetchType.LAZY FetchType.EAGER をJavaのPersistence APIで使用することはできますか?

どのように解決するのですか?

2つのエンティティがあり、それらの間に関係がある場合があります。たとえば、次のようなエンティティがあるとします。 University というエンティティがあり、さらに Student そして、大学には多くの学生がいます。

Universityエンティティは、id、name、addressなどの基本的なプロパティと、指定された大学の学生のリストを返すstudentsというコレクションプロパティを持つかもしれません。

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

   // setters and getters
}

さて、データベースから大学を読み込むと、JPAはそのid、name、addressフィールドを読み込んでくれます。しかし、学生がどのようにロードされるかについては、2つのオプションがあります。

  1. 他のフィールドと一緒にロードする (つまり、イーガーリー)、あるいは
  2. を呼び出したときにオンデマンドで (つまり遅延して) ロードする。 getStudents() メソッドを使用します。

大学が多くの学生を抱える場合、特に必要のない学生まで一緒に読み込むのは効率が悪く、そのような場合は、実際に必要なときに学生を読み込むように宣言することができます。これをレイジーローディングと呼びます。

以下に例を示します。 students は、イーガーリーに読み込まれるように明示的にマークされています。

@Entity
public class University {

    @Id
    private String id;

    private String name;

    private String address;

    @OneToMany(fetch = FetchType.EAGER)
    private List<Student> students;

    // etc.    
}

そして、この例では students は遅延ロードされるように明示的にマークされています。

@Entity
public class University {

    @Id
    private String id;

    private String name;

    private String address;

    @OneToMany(fetch = FetchType.LAZY)
    private List<Student> students;

    // etc.
}