1

EntityAとEntityBの2つのエンティティがあるとします。
EntityBはEntityAに@OneToOne関連しています。

@Entity
public class EntityB {
    @OneToOne(fetch = FetchType.LAZY)
    private EntityA entA;

    // other stuff
}

DBからEntityBをロードすると、対応するEntityA(たとえばentA1)が遅延ロードされます。
その後、EntityAリストをロードします

   List result = entityManager.createQuery("select A from EntityA A")
                  .setFirstResult(start).setMaxResults(end).getResultList();

結果リストには、以前に遅延ロードされプロキシされたEntityAと、次のような通常のマテリアライズされたEntityAの両方が含まれます。

EntityA
EntityA_$$_javassist_nnn   <--- entA1 which is loaded lazily earlier
EntityA
...

だから私の質問:
1)これは予想される動作ですか?それに関するapidoc情報はどこにありますか?
2)プロキシされたエンティティのみを完全にロードできますか、それともすべてを熱心にロードできますか?混合されていません。

4

1 に答える 1

4

はい、これは予想される動作です。Hibernate は、セッション内にエンティティのインスタンスを 1 つだけ持つためにできる限りのことを行います。EntityB をロードしたときにセッションに格納された EntityA へのプロキシが既にあるため、同じ EntityA インスタンスを返す後続のクエリは、実質的に同じインスタンスを返します: プロキシはセッションに既に格納されています。

リストにプロキシが含まれているという事実はあまり気にする必要はありません。プロキシ ( を除くgetClass()) で任意のメソッドを呼び出すと、プロキシされていないエンティティで呼び出した場合と同じ結果が返されます。

私の知る限り、オブジェクトにはメソッドさえありませんが、エンティティのコレクションが添付されたオブジェクトで正しく動作することを可能にしますequals()

于 2012-08-02T11:46:44.213 に答える