0

私が得たと仮定します

 class Father{

private Integer fatherId;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="FATHERID", nullable=false)
public Integer getFatherId() {
    return fatherId;
}    


Set<Son> sons;

@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name="FATHERID")
public Set<Son> getSons() {
    return airlineFlights;
}
}

と息子

   class Son{


Integer sonId
@Id
@GeneratedValue(generator="identity")
@GenericGenerator(name="identity", strategy="identity")
@Column(name="SONID", nullable=false)
public Integer getSonId() {
    return sonId;
}

 Father father;

     @ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="FATHERID", nullable=false)
public Father getFather() {
    return father;
}

}

今、私がこのコードを取得したと仮定しましょう:

 Father f = session.load(Father.class, 1);
 f.getSons();

fは単純なPOJOであり、息子のコレクションは怠惰なので、ここで何が起こりますか?データベースへのアクセスとそれらの息子のクエリはどのように行われていますか?単純なgetが呼び出される単純なJVMにいますが、そこで休止状態はどのように機能しますか?

編集:getSons()が呼び出されるとどうなりますか?完全なサイケールを与えることができますか?

4

2 に答える 2

2

どの環境でも同じように機能します。Hibernate は、アクティブなセッションが存在すると仮定して、遅延ロードされたコレクションを取得するためにデータベースを呼び出します。親オブジェクトのロードに使用したセッションとは別のセッションをアクティブにしている場合は、merge最初に親にアクセスする必要があることに注意してください。

それがどのように機能するかについては、バイトコードのインストルメンテーションです。舞台裏では、Hibernate は「プロキシ」オブジェクトを作成してエンティティをラップし、必要に応じてこのプロキシからメソッド呼び出しを行い、呼び出し元の要求を満たします。

非常に大まかに、次のようなことが起こります。

Father (FatherProxy) -> Lazy Collection Reference -> Session -> Load Entities
于 2013-02-21T19:25:36.140 に答える
0

ログに 2 つのクエリが表示されます。最初のクエリは父親をロードし、次に getSons() を呼び出しているため、息子をフェッチするため、そのための 2 番目のクエリが表示されます。

于 2013-02-21T19:25:12.610 に答える