2013-08-27 77 views
0

我認爲這是一個不尋常的用例。Hibernate延遲加載瞬態字段

說我有一個實體類Foo:

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

    private String bar; 

    @Transient 
    private long bazz; 

    ... 
} 

我也有一個攔截器定義成Foo.bazz被初始化時的Foo實例從數據庫中讀取:

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的每個實例找到一個值有時會被不必要地調用。

如何避免調用代碼來查找bazz的值,除非實際調用Foo.getBazz()?

+0

是否有任何理由你不能在Foo.getBazz()中運行你的重量級代碼?什麼是重量級的做法? – samlewis

+0

我想你需要實現一些類型的代理類。但我真的不明白你爲什麼這樣做?什麼是重量級代碼,很多數據庫調用?如果是這樣,這是做錯的地方。 – varun

+1

請提供您的使用案例,可能是我們可以更好地爲您提供幫助。 – varun

回答

0

好吧,經過反思:

使用攔截器將對象填充到Foo實例中。該對象可以進行延遲初始化,而不會違反關注點分離。