2013-01-04 1 views
2

지속성을 위해 hibernate/JPA을 사용하는 응용 프로그램이 있습니다. 스프링을 사용합니다.
일부 지속 bean은 REST 서비스에서 검색하는 외부 오브젝트에 의존합니다.관리 엔티티에 컨텍스트를 인식시키는 방법은 무엇입니까?

이 REST 서비스의 클라이언트 스텁은 등록 된 스프링 서비스입니다.

최대 절전 모드가 진행되는 동안 해당 외부 개체의 부하를 감 쌉니다. 이렇게하면 복잡한 HQL 쿼리를 통해 객체를 가져 오더라도 내 객체가로드 후에 항상 유효하다는 것을 알 수 있습니다.

문제는 어떤 방법을 사용하든 내 지속 된 빈에서 (따라서 REST 클라이언트) 스프링 애플리케이션 컨텍스트를 얻는 데 어려움이 있습니다.
CustomUserType는 Hibernate에 의해 통해 인스턴스되고, 따라서 더 봄 분사가 발생할 수 있습니다 : 자신의 ID를 통해 REST에서 내 개체를 가져

  • 사용 UserType을 :

    나는 다음을 시도했다.

  • 사용 JPA 주석 @AfterLoad :
    이 하나 더 나쁘다를 더 EntityManager의 세션 또는 사용 가능한 Spring 컨텍스트
  • 사용자 LifeCycle의 인터페이스에 onLoad (세션들, 직렬화 ID) 방법 :
    나는 액세스 할 수 없습니다 여기에 세션에. 하지만 ApplicationContext을 인식하는 맞춤 세션을 만드는 방법을 모르겠습니다. 시간에 대한

내가 더러운 해결 방법을 사용하고, 인 : 봄 WOLRD에서 개체에 대한 정적 게터를 제공하는 ApplicationHolder 봄 서비스가 그것에 액세스 할 수 있습니다.

최대 절전 모드 나 지속 된 빈 컨텍스트를 인식하는 방법에 대해 실전이 있습니까? 내 DAO에 그 일을

THks

편집

내 첫 번째 방법 이었지만, 실제로 나는 그렇게 같이 가져 오는 필요 많은 하위 개체가 :

LocalObject 
* - localSubObject1 
    - refToExternalObject ----------> externalObject1 
* - localSubObject2 
    - refToExternalObject ----------> externalObject2 
    - refToExternalObject ----------> externalObject3 

내가 좋아하는 것을 내 LocalObject가 일관되고 깨끗한로드를 갖습니다.

이렇게하면 필자는 DAO에서 Complex HQL을 작성하고 더 이상 외부 객체를 가져 오지 않을 수 있습니다.

+0

Hibernate Dao를 Bean (SessionFactory 등을 삽입하는 어쩌면 어쩌면)으로 가지고 있고 반환하기 전에 Dao 메소드에서 엔티티 초기화를 완료하는 것이 더 깔끔합니다. –

+0

나는 아직도 DAO가 갈 길이라고 생각한다. 가져올 필요가있는 외부 엔티티에 사용자 정의 주석을 추가 할 수 있으며, DAO는 주석을 찾아 무엇을 스캔 할지를 확인합니다. http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/ –

답변

1

어쩌면이 일할 수 :

@Component 
public class MyPostLoadEventListener implements PostLoadEventListener { 

    @Resource 
    private SessionFactoryImpl sessionFactoryImpl; 
    @Resource 
    private RestClient restClient; 

    @PostConstruct 
    public void installAsEventListener() { 
     sessionFactoryImpl.getServiceRegistry() 
           .getService(EventListenerRegistry.class) 
           .getEventListenerGroup(EventType.POST_LOAD) 
           .appendListener(this); 
    } 

    @Override 
    public void onPostLoad(PostLoadEvent event) { 
     if (event.getEntity() instanceof LocalObject) { 
      // fill with data from RestClient 
     } 
    } 
} 

이가이다 약간 불편하지만, 유감스럽게도 Hibernate EventListeners (컨피그레이션 또는 Integrators)를 등록하는 다른 방법은 Spring bean이 (abandoned JIRA entry에서 언급 한 것처럼) 직접 인스턴스화 될 때 사용할 수 없다.

희망이 있습니다.

1

내 의견을 설명하는 솔루션의 빠른 스케치 : 당신이 다오에서 그것을하지 않으려면

@Component 
public class HibernateDao { 

    @Resource 
    private SessionFactory sessionFactory; 
    @Resource 
    private RestClient restClient; 


    public LocalObject loadLocalObject(Serializable id) { 
     LocalObject localObject = sessionFactory.getCurrentSession().load(id); 
     ExternalObject externalObject = restClient.getExternalObject(id); 

     localObject.setVal(externalObject.getVal()) 
     // ... more of this ... 

     return localObject; 
    } 
} 
+0

게다가 도메인 객체에서 논리를 유지합니다! –

+0

그게 내 첫 접근 이었어. 내 편집을 참조하십시오. –

관련 문제