web-dev-qa-db-ja.com

FetchModeとFetchTypeの違い

lazy = "true"の指定とfetch = "select" or "join"の使用の違いは何ですか?どちらが他よりも優先されますか?

よろしく

25
jayendra bhatt

次のようなエンティティがあるとします。

_@Entity
@Table
public class Parent {
    @Id
    private Long id;

    @OneToMany(mappedBy="parent", fetch = FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    private List<Child> child;    
    //getter setters
}


@Entity
@Table
public class Child {    
    @Id
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    private Parent parent;

    //getter setter
}
_

上記の例では、Parentエンティティを取得すると、hibernateは自動的にすべてのchildエンティティをjoinを使用して積極的にロードします。一方、Childをフェッチすると、コードで明示的に呼び出す場合を除いて、Parentエンティティは選択されませんchild.getParent()

FetchType(Lazy/Eager)は、コードに呼び出しがある場合に、エンティティを積極的にロードするか、レイジーにロードするかを示します。

FetchMode(Select/Join)は、追加のselectを使用してエンティティをロードするか、joinまたはsubselectを使用した1つのクエリでエンティティをロードするかを示します。

28
kamil

FetchMode:定義しますhow hibernate(どの戦略、たとえばJoin、SubQueryなどを使用)がデータベースからデータをフェッチします。

FetchType:定義しますwhether hibernateはデータを取得するかどうかを指定します。

[〜#〜] note [〜#〜]FetchModeは、FetchType = EAGER注釈中。

23