0

これは珍しいユースケースだと思います。

エンティティ クラス Foo があるとします。

@Entity
public class Foo {
    @Id
    private Long id;

    private String bar;

    @Transient
    private long bazz;

    ...
}

また、データベースから Foo のインスタンスが読み取られたときに Foo.bazz が初期化されるように Interceptor を定義しています。

public class MyInterceptor extends EmptyInterceptor {
    ...

    @Override
    public boolean onLoad(
        Object entity,
        Serializable id,
        Object[] state,
        String[] propertyNames,
        Type[] types) {

        if(entity instanceof Foo) {
            Foo foo = (Foo)entity;

            long bazzValue = ... // some very heavyweight code

            foo.setBazz(bazzValue);
        }

        return false;
    }
    ...
}

ここまでは順調ですね。しかし、すべてのコード パスがすべての Foo インスタンスの bazz フィールドの値を必要とするわけではありません。これは、Foo のすべてのインスタンスの値を見つけるための重いコードが、不必要に呼び出される場合があることを意味します。

Foo.getBazz() が実際に呼び出されない限り、bazz の値を見つけるためにコードを呼び出さないようにするにはどうすればよいですか?

4

1 に答える 1

0

OK、よく考えてみると:

インターセプターを使用して、オブジェクトを Foo インスタンスに取り込みます。このオブジェクトは、関心の分離に違反することなく遅延初期化を行うことができます。

于 2013-08-30T15:35:28.383 に答える