2013-08-27 4 views
0

나는 이례적인 유스 케이스라고 생각한다. 그래서최대 절전 모드 Lazy-load transient fields

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가 초기화되는 푸의 인스턴스가 데이터베이스에서 읽을 때 나는 또한 인터셉터는 정의

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

    private String bar; 

    @Transient 
    private long bazz; 

    ... 
} 

:

내가 엔티티 클래스 푸 말해봐 멀리, 너무 좋아. 그러나 모든 코드 경로가 모든 Foo 인스턴스의 bazz 필드 값을 필요로하지는 않습니다. 이것은 Foo의 모든 인스턴스에 대한 값을 찾기위한 헤비급 코드가 때때로 불필요하게 호출된다는 것을 의미합니다.

Foo.getBazz()가 실제로 호출되지 않으면 bazz 값을 찾기 위해 코드를 호출하지 않으려면 어떻게해야합니까? 반사에 따라

+0

헤비급 코드를 Foo.getBazz()에서 실행할 수없는 이유가 있습니까? 헤비급은 무엇을하고 있습니까? – samlewis

+0

일부 유형의 프록시 클래스를 구현해야한다고 생각합니다. 하지만 정말로이 일을 왜하는지 이해가 안되니? 그리고 헤비급 코드, 많은 DB 호출은 무엇입니까? 그것이 그렇다면, 이것이 잘못된 장소입니다. – varun

+1

사례를 제공하십시오. 더 잘 도와 드리겠습니다. – varun

답변

0

확인 :

는 푸 인스턴스로 객체를 채울 인터셉터를 사용합니다. 이 객체는 관심의 분리를 위반하지 않고 지연 초기화를 수행 할 수 있습니다.