2

Hibernate は javassist ライブラリを使用して、オブジェクトの遅延初期化を処理しているようです。次のエンティティがあるとします (ゲッター/セッター/注釈は切り捨てられます):

@Entity
public class MainEntity {
    private ComponentEntity comp;
}

@Entity
public class ComponentEntity {
    private Integer id;
    private String name;
}

ここで、次のメソッドを呼び出します。

@Transactional
public void doSomething() {
    MainEntity main = this.dao.find(1);

    // Case A
    main.getComp().getName();
    // Case B
    String localVariableName = main.getComp().getName();
}

DAO が main を取得するとき、compオブジェクトは遅延初期化のためにまだ初期化されていません。を呼び出した後Case Acompオブジェクトはデータベースから取得されていると思いますが、デバッガーに基づいて、すべての comp オブジェクトのプロパティが null として表示されます。

localVariableName が null 以外の値を取得していることを確認できるのは、値をCase Bに保存した後でのみです。namelocalVariableName

Eclipse でオブジェクトのプロパティが null として表示されるのはなぜですか?

4

1 に答える 1

10

Hibernate-managed objects that are lazily-initialized are managed by javassist proxy objects. Therefore in the Eclipse debugger, you have to know where to look.

screenshot of null proxy object with handler.initialized set to false

The offer object is a proxy object that contains a handler object which contains a flag called initialized. It's currently set to false.

screenshot of proxy object with null props but with hander.initialized set to true and handler.target containing the initialized actual object

After Case A, the handler's initialized flag is now set to true. The handler.target object also changes to reflect the actual offer object's initialized properties.

So the lazy initialization is working as intended.

于 2012-10-12T06:48:02.163 に答える