Hibernate延迟加载瞬态字段

时间:2013-08-27 20:56:04

标签: java spring hibernate lazy-loading transient

我希望这是一个不寻常的用例。

假设我有一个实体类Foo:

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

    private String bar;

    @Transient
    private long bazz;

    ...
}

我还定义了一个Interceptor,以便在从数据库中读取Foo的实例时初始化Foo.bazz:

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的值?

1 个答案:

答案 0 :(得分:0)

好的,经过反思:

使用拦截器将对象填充到Foo实例中。这个对象可以进行延迟初始化而不会违反关注点的分离。