2013-08-27 3 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. Это означает, что супертяжелый код для поиска значения для каждого экземпляра Foo иногда бесполезно вызывается.

Как я могу избежать вызова кода, чтобы найти значение для bazz, если Foo.getBazz() фактически вызван?

+0

Есть ли какая-то причина, по которой вы не можете управлять своим тяжеловесным кодом в Foo.getBazz()? Что делает супертяжеловес? – samlewis

+0

Думаю, вам нужно реализовать некоторый тип прокси-класса. Но на самом деле я не понимаю, почему вы это делаете? И что такое супертяжелый код, много звонков? если это так, это неправильное место для этого. – varun

+1

, пожалуйста, предоставьте свой прецедент, возможно, мы сможем помочь вам лучше. – varun

ответ

0

ОК, при отражении:

Используйте перехватчик для заполнения объекта в экземпляр Foo. Этот объект может выполнять ленивую инициализацию без нарушения разделения проблем.