2017-04-11 2 views
1

스프링 부트 및 스프링 데이터 설정 (@Data)이 있습니다. 한 엔티티의 속성이 변경되면 몇 가지 작업을 수행해야합니다. 관찰자 패턴을 사용하려고합니다. 코드에서 해당 속성의 setter를 호출 할 때 stateChanged를 추가했습니다. 예상대로 작동 할 것이라고 생각하십니까, 아니면 봄이 장면 뒤에서 세터를 부르는 것입니까?엔티티의 옵저버가 항상 작동하지 않는 경우

답변

4

봄은 확실히이 세터를 수시로 호출하지 않습니다.

엔터티 업데이트가 데이터베이스에 유지되기 바로 전에 사용자 지정 코드를 실행하려면 엔터티 클래스의 메서드에서 @PreUpdate 주석을 사용하거나이 메서드를 사용하여 상위 수준의 추상 엔터티 클래스를 가질 수 있습니다. @PreUpdate 코드는 동일합니다.

@PreUpdate 
public void onPreUpdate() { 
    //your custom code here 
} 

이렇게하면 설정자로부터 stateChanged 통화를 제거 할 수 있습니다.

+0

내가 setter에서 stateChange를 그대로두면 해당 객체를 사용하는 모든 쿼리에서 주제가 통보된다는 것을 의미합니까? – strash

+0

데이터를 직렬화 할 때 현재 버전이 setter를 호출하지 않는 것처럼 보입니다. 나는 내 대답을 편집 할 것이다. '@ PreUpdate' 예제와 같이'@ PostLoad' 주석을 사용하여 엔티티가로드 될 때 알림을받을 수 있습니다. 이 관찰자들과 함께 무엇을 이루려고합니까? 더 큰 그림을 제시하면 더 나은 답을 얻을 수 있습니다. –

+0

amazon SNS를 사용하여 알림을 보내야합니다. 내 엔티티 중 하나에서 속성이 변경되면 팔로어에게 알릴 때입니다. – strash

1

우리는 두 가지 시나리오에 대한 비슷한 필요성을 가지며 두 가지 다른 솔루션을 사용해야했습니다.

우리는 세션 팩토리에 org.hibernate.event.service.spi.EventListenerRegistry를 사용하고 PRE_UPDATE 나 SAVE 등과 같은 필수 이벤트를 들었다. 우리의 경우 리스너는 다른 애플리케이션에 대한 지식이있다. . 그런 다음 이벤트 리스너는 이벤트 발생에 대한 필수 빈을 통지합니다. 그러나 이것은 최대 절전 모드 이벤트에만 유효합니다.

다른 시나리오의 경우 우리는 응용 프로그램의 다른 부분에 재미있는 일이 있음을 알려야했습니다. 정확히 관찰 할 수있는 패턴은 아니지만 필요성은 비슷했습니다. 우리는 org.springframework.context.ApplicationEventPublisher를 사용했고 다른 빈들은 org.springframework.context.ApplicationListener를 사용하여 원하는 유형의 이벤트를 들었다.

제 경험상 두 번째 방법은 클래스가 서로를 인식하지 못해 훨씬 더 깔끔했습니다. 그러나 엔티티가 최대 절전 모드 엔티티 인 경우이 방법은 작동하지 않을 수 있습니다.

-1

아직 그 질문에 대해 연구 중입니다. 그러나. .. 나는 대답을 찾은 것 같아. 왜냐하면 저는 봄 환경에서 세터가 현장 뒤에서 전화를받는 것을 보았 기 때문입니다. 생성자에서 AUTOWIRING- 속성과 autowiring을 FROM ITS

@Autowired private ServiceTest testService; 

대 우리가 를 사용하는 경우 그래서 관찰자 패턴이 봄 환경에서 법인에 적용 할 수

@Autowired 
public ServiceOther(ServiceTest testService){ 
    this.testService = testService; 
} 

해당 속성에 대한생성자에서 자동 배선.

아직도 1000 % 확신 할 수 없습니다. 따라서 누군가가 주제에 능숙하다면 설명하십시오.

관련 문제