봄에 의한 데이터베이스 이벤트 처리

리시

스프링으로 데이터베이스 이벤트를 처리하고 싶습니다. 봄에는 이벤트 처리 메커니즘이 있으며 봄에 몇 가지 사용자 지정 이벤트 처리기를 정의했습니다. 예를 들어 직원이 시스템에서 비활성화되어 특정 활동 집합을 수행해야하는 경우 스프링 사용자 지정 이벤트 목록 작성기를 실행할 수있는 방법이 있습니다. 최대 절전 모드로 봄을 사용하고 있습니다. 이것을 달성하기 위해 최대 절전 모드가 될 수 있는지 의심하지만 봄을 처리하고 싶습니다. 미리 감사드립니다

프라 사드

내가 귀하의 질문을 올바르게 이해했다면, 최대 절전 모드 엔티티 변경 이벤트를 가로 채고 Spring에서 처리 할 수있는 이벤트를 트리거하는 방법을 알아야합니다. 항상 하이버 네이트에서 이벤트를 가로 챌 수 있습니다. 즉, 인터셉터를 사용하여 하이버 네이트 엔티티 요소의 속성 값을 검사 및 / 또는 변경할 수 있습니다. 예를 들어 Employee 엔터티에는 상태 (예 : String) 필드가 있으며,이 필드에 대한 변경 (예 : 활성에서 비활성으로 변경)을 감지하고 변경 사항이 데이터베이스에 유지되기 전에 몇 가지 작업을 수행 할 수 있습니다. 이 엔터티에있는 컬렉션에 대한 변경 사항도 가로 챌 수 있습니다. 간결함을 위해 필드 변경 만 수행합니다.

필드 변경 추적을위한 리스너 인터페이스 FieldChangeListener를 다음과 같이 정의하십시오.

    public interface FieldChangeListener<T>{
        /**
         *  Defining generically so that it can be implemented by any entity on which field change needs to be observed.     
         * @param propertyName - the property name on the entity    
         * @param entity - the entity object    
         * @param previousState - the old value    
         * @param currentState - the new value    
         * */  
            void onChange(Object[] previousState, Object[] currentState, String[] propertyName, Type[] types, Object entity);    
    } 

인터셉터를 사용하려면 EmptyInterceptor 를 확장하는 클래스를 만들어야합니다 .

    public class FieldChangeInterceptor extends EmptyInterceptor {
        private Map<Class, FieldChangeListener<?>> listeners;       

        public void setListeners(Map<Class, FieldChangeListener<?>> listeners) {
            this.listeners = listeners;
        }

        @Override
        public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {       
            FieldChangeListener<?> listener = listeners.get(entity.getClass());
            boolean report = false;
            // Only check for changes if an entity-specific listener was registered.
            if (listener != null) {
                listener.onChange(previousState, currentState, propertyNames, types, entity);
                report = true;
            }
            return report;
        }   
    }

컨텍스트 xml에서 인터셉터와 리스너를 다음과 같이 정의하십시오.

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        ...
    </bean>
    <bean id="fieldInterceptor" class="package.FieldChangeInterceptor">
        <property name="listeners">
            <util:map id="listeners" map-class="java.util.HashMap">
                <entry>
                    <key><value>package.Employee</value></key><ref bean="employeeListener"/>
                </entry>                
            </util:map>
        </property>
    </bean> 
    <bean id="employeeListener" class="package.listener.EmployeeListener"/>

EmployeeListener 클래스는 다음과 같습니다.

    public class EmployeeListener implements FieldChangeListener<Employee>, ApplicationEventPublisherAware{         

        private ApplicationEventPublisher publisher;
        public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
            this.publisher = publisher;
        }

        @Override
        public void onChange(Object[] previousState, Object[] currentState, String[] propertyName, Type[] types, Object obj) {
            log.info("Enter onChange()...");
            Employee employee = (Employee)obj;
            boolean isChange = false;
            for (int i = 0; i < currentState.length; i++) {
                if (currentState[i] == null) {
                    if (previousState[i] != null){
                        isChange = true;
                    }else{
                        isChange = false;
                    }
                } else if (!currentState[i].equals(previousState[i])) {
                    isChange = true;
                }
                if (isChange) {
                        //check for status property of Employee
                        if(propertyName[i].equals("status")){
                        //Do your activity here - maybe you want to publish application event using eventService.       
                        //Define event. 
                            publisher.publishEvent(event);
                        }
                        report = false;
                    }           
            }       
            log.info("Exit onChange()...");
    }

사용자 지정 ApplicationEvent를 게시하려면 ApplicationEventPublisher에서 publishEvent () 메서드를 호출합니다. 이벤트 게시에 대한 자세한 내용은 여기에서 섹션 5.14.2 표준 및 사용자 지정 이벤트를 확인 하십시오 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Meteor의 데이터베이스에서 데이터 처리

분류에서Dev

실패한 데이터베이스 연결에서 SSIS OnError 이벤트 처리기가 시작되지 않음

분류에서Dev

데이터베이스에 의한 봄 rbac 인증

분류에서Dev

스레드 이벤트에 대한 인터럽트 처리기

분류에서Dev

Oracle 데이터베이스에 대한 "UPDATE vs. INSERT"쿼리 일괄 처리

분류에서Dev

beforeunload 이벤트에서 데이터베이스 쿼리

분류에서Dev

nodeJS의 데이터베이스에 대한 비동기 쿼리

분류에서Dev

데이터베이스의 날짜 항목은 어디에 있습니까-CybersourcePK의 WooCommerce 이벤트 관리자

분류에서Dev

C #의 XBOX 컨트롤러에 대한 이벤트 처리기?

분류에서Dev

데이터베이스 모델링 모범 사례 : 동일한 "베이스"에 대한 연관 처리

분류에서Dev

열 쿼리에 대한 데이터베이스 트리거

분류에서Dev

봄 데이터베이스에 대한 많은 연결을 관리하는 방법?

분류에서Dev

여러 Observable의 결과를 데이터베이스로 처리하고 데이터베이스에 한 번 추가

분류에서Dev

PHP에 의한 데이터 처리

분류에서Dev

데이터베이스에 의사 결정 트리 적용

분류에서Dev

WSUS 데이터베이스에 서버 당 필요한 업데이트 쿼리

분류에서Dev

Kotlin에서 이벤트 버스의 일반 리스너 처리

분류에서Dev

[데이터베이스를 이용한 푸리에 분석]

분류에서Dev

MS 액세스 데이터베이스에 대한 쿼리에서 일본어 문자 처리 (RStudio에서)

분류에서Dev

트리거 이벤트시 데이터베이스에 PHP 변수 삽입

분류에서Dev

데이터베이스의 큰 테이블에 대한 쿼리 최적화 (SQL)

분류에서Dev

여러 데이터베이스에서 Springboot + 봄의 데이터를 동일한 엔티티

분류에서Dev

다른 데이터베이스 테이블을 업데이트하기위한 이벤트 리스너 생성

분류에서Dev

봄 부팅 엔터티에 대한 데이터베이스보기 만들기

분류에서Dev

AWS의 데이터베이스에 대한 교차 리전 액세스

분류에서Dev

mySQL 데이터베이스 삽입에서 동시성을 처리하기위한 논리적 제약 관리

분류에서Dev

하나의 트랜잭션 범위에서 여러 데이터베이스 연결 처리

분류에서Dev

데이터베이스에 액세스 할 때 Python에서 병렬 처리의 메모리 소비

분류에서Dev

하이 차트 차트에 데이터베이스의 두 시리즈 포함

Related 관련 기사

  1. 1

    Meteor의 데이터베이스에서 데이터 처리

  2. 2

    실패한 데이터베이스 연결에서 SSIS OnError 이벤트 처리기가 시작되지 않음

  3. 3

    데이터베이스에 의한 봄 rbac 인증

  4. 4

    스레드 이벤트에 대한 인터럽트 처리기

  5. 5

    Oracle 데이터베이스에 대한 "UPDATE vs. INSERT"쿼리 일괄 처리

  6. 6

    beforeunload 이벤트에서 데이터베이스 쿼리

  7. 7

    nodeJS의 데이터베이스에 대한 비동기 쿼리

  8. 8

    데이터베이스의 날짜 항목은 어디에 있습니까-CybersourcePK의 WooCommerce 이벤트 관리자

  9. 9

    C #의 XBOX 컨트롤러에 대한 이벤트 처리기?

  10. 10

    데이터베이스 모델링 모범 사례 : 동일한 "베이스"에 대한 연관 처리

  11. 11

    열 쿼리에 대한 데이터베이스 트리거

  12. 12

    봄 데이터베이스에 대한 많은 연결을 관리하는 방법?

  13. 13

    여러 Observable의 결과를 데이터베이스로 처리하고 데이터베이스에 한 번 추가

  14. 14

    PHP에 의한 데이터 처리

  15. 15

    데이터베이스에 의사 결정 트리 적용

  16. 16

    WSUS 데이터베이스에 서버 당 필요한 업데이트 쿼리

  17. 17

    Kotlin에서 이벤트 버스의 일반 리스너 처리

  18. 18

    [데이터베이스를 이용한 푸리에 분석]

  19. 19

    MS 액세스 데이터베이스에 대한 쿼리에서 일본어 문자 처리 (RStudio에서)

  20. 20

    트리거 이벤트시 데이터베이스에 PHP 변수 삽입

  21. 21

    데이터베이스의 큰 테이블에 대한 쿼리 최적화 (SQL)

  22. 22

    여러 데이터베이스에서 Springboot + 봄의 데이터를 동일한 엔티티

  23. 23

    다른 데이터베이스 테이블을 업데이트하기위한 이벤트 리스너 생성

  24. 24

    봄 부팅 엔터티에 대한 데이터베이스보기 만들기

  25. 25

    AWS의 데이터베이스에 대한 교차 리전 액세스

  26. 26

    mySQL 데이터베이스 삽입에서 동시성을 처리하기위한 논리적 제약 관리

  27. 27

    하나의 트랜잭션 범위에서 여러 데이터베이스 연결 처리

  28. 28

    데이터베이스에 액세스 할 때 Python에서 병렬 처리의 메모리 소비

  29. 29

    하이 차트 차트에 데이터베이스의 두 시리즈 포함

뜨겁다태그

보관