복붙노트

[SPRING] 모든 데이터베이스 쿼리에 대한 전역 최대 절전 모드 필터

SPRING

모든 데이터베이스 쿼리에 대한 전역 최대 절전 모드 필터

내 웹 응용 프로그램에 Spring MVC와 Hibernate를 사용하고 있습니다. 각 DAO 메서드에서 명시 적으로 활성화하지 않고 DAO 클래스의 각 쿼리에 적용 할 일종의 전역 최대 절전 필터를 만드는 방법을 찾고 있습니다.

요구 사항은 사용자가 선택한 세션 변수로 레코드를 필터링하는 것입니다. 따라서 우리의 질의 매개 변수는 세션에서 유지되고 해당 세션의 모든 DAO 쿼리는이 변수로 결과를 필터링해야합니다. 여기에있는 목적은 모든 DAO 방법에서 모든 반복 가능한 필터링 코드를 피하는 것입니다.

모든 아이디어를 환영합니다!

해결법

  1. ==============================

    1.나가 이것을 여기에서 처리하는 방법을두기. 아래는 @ Rp-와의 토론과 여기에서 제안한 내용을 기반으로합니다.

    나가 이것을 여기에서 처리하는 방법을두기. 아래는 @ Rp-와의 토론과 여기에서 제안한 내용을 기반으로합니다.

    이 세 가지 주요 요소가 구성되었습니다. - 봄 세션 콩 - package-info.java - 봄 AOP

    내 사용자가 선택한 변수를 보유 할 세션 범위의 Spring bean을 만들었습니다. 변수는 스프링 컨트롤러 매핑 방법을 통해 사용자의 요청에 따라 수정됩니다. 스프링 관리 빈에서 개최되고 있기 때문에 스프링 의존성 주입을 통해 응용 프로그램의 어느 곳에서나 세션 변수에 액세스 할 수 있습니다.

    @Component
    @Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
    public class SessionParam implements Serializable{
    
      private String sessParam;
    ..
    ..
    }
    

    다음으로 나는 패키지 레벨에서 내 절전 필터를 정의한다. 이는 package-info.java 파일에서 수행됩니다. 따라서이 패키지의 모든 엔티티는이 필터를 상속합니다.

     @FilterDef(name="GLOBAL_FILTER",   parameters = {@ParamDef(name="sessParam", type="string")}, 
                                        defaultCondition = "sessParam = :sessParam")
    
    package com.company.app.entity;
    import org.hibernate.annotations.FilterDef;
    import org.hibernate.annotations.FilterDefs;
    import org.hibernate.annotations.ParamDef;
    

    패키지의 엔티티는 다음과 같이 hibernate의 @Filter 주석으로 주석 처리됩니다.

    @Entity
    @Filter(name="GLOBAL_FILTER")
    @Table(name = "TABLE_XYZ", schema = "SCHEMA_ABC")
    public class TableXyz implements Serializable {
    ...
    }
    

    마지막으로, 모든 DAO 쿼리는 Hibernate의 Session Factory의 getCurrentSession () 메소드에 대해 AspectJ aspect를 사용하여 인터셉트된다.

    아래는 Aspect 클래스입니다.

    @Aspect
    @Component
    public class GlobalFilter {
    
        @Autowired
        SessionParam sessionParam;
    
    
        @Pointcut("execution(* org.hibernate.SessionFactory.getCurrentSession(..))")
        protected void hibernateSessionFetch(){
    
        }
    
        @AfterReturning(pointcut = "hibernateSessionFetch()", returning = "result")
        public void enableGlobalFilter(JoinPoint joinPoint, Object result){
    
            Session session = (Session) result;
    
            session.enableFilter("GLOBAL_FILTER").setParameter("sessParam", sessionParam.getSessParam());
    
        }
    }
    

    "GLOBAL_FILTER"가있는 항목에 대한 모든 쿼리는 이제 필수 변수에 대한 조건부 검사를 갖습니다. DAO 방법에는 각 쿼리에 명시적인 조건부 검사가 필요하지 않습니다.

  2. from https://stackoverflow.com/questions/25855260/global-hibernate-filter-on-all-database-queries by cc-by-sa and MIT license