7

私は JPA で Hibernate を使用しており、次のような関係があります。

public class PencilImpl implements Pencil {

    @ManyToOne(targetEntity = PersonImpl.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "owner", nullable = false)
    private Person owner;

    ...

    @Override
    public final Person getOwner() {
        return owner;
    }
}

LAZY fetch タイプを使い始めて以来、鉛筆の所有者 ( Pencil.getOwner ) を取得しようとするたびに、内部プロパティがすべて null に設定された null 以外のオブジェクトを取得します。

Hibernate によって作成されたプロキシが、必要なときにデータベースから実際のオブジェクトを取得していないようです。

何か案は?ありがとう :)

4

2 に答える 2

8

これは単に、Hibernate が遅延読み込みを実装する方法です。エンティティ クラスのインスタンスではなく、プロキシ オブジェクトが提供されます。あなたが言う時

すべての内部プロパティが null に設定されている非 null オブジェクト

それはおそらく、デバッガーで見たものですよね? コードまたはデバッガー内の呼び出しを介してこれらのプロパティのいずれかにアクセスすると、Hibernate はバックグラウンドで DB からデータをロードし、エンティティ クラスのインスタンスを構築し、すべての呼び出しを行います。プロキシ オブジェクトは、透過的に実際のエンティティに委任されます。したがって、通常、理想的には、Hibernate プロキシ <-> エンティティ オブジェクトの区別を気にする必要はありません。

いずれにせよ、その違いを認識すべき 2 つの理由を考えることができます。

  1. パフォーマンス: 遅延ロードされたコレクションの要素にループでアクセスすると、遅延ロードによってアプリの速度が大幅に低下する可能性があります
  2. 継承: データ モデルが継承を使用する場合は、instanceofおよびキャストに十分注意してください。オブジェクトが Hibernate プロキシであるかどうかをテストする方法と、それを実際のエンティティ オブジェクトに変換する方法については、この SO の質問をお読みください。
于 2012-01-20T17:38:25.893 に答える
2

JB Nizet が示唆したように、私のクラスのゲッターの最終修飾子は、遅延ロードされた関係のために hibernate が作成するプロキシをいじっていました。

于 2012-01-27T18:10:42.337 に答える