2013-03-07 5 views
2

저는 Groovy와 Grails를 처음 사용하지만 저는 Hibernate에 익숙합니다. 내가 일하고있는 프로젝트의 경우 특정 도메인 클래스의 부드러운 삭제을 구현해야합니다. Hibernate Filters은 적당한 솔루션으로 보였습니다. 도메인 클래스에 조건을 추가하면 모든 쿼리에 조건을 수동으로 추가하지 않고 소프트 삭제 된 레코드를 걸러 낼 수있었습니다. 다행히도 Grails는 Hibernate Filter plugin을 제공하여 Grails에서 Hibernate Filters를 사용하기 쉽게 만들어야한다.Grails Hibernate Filters 플러그인이 작동하고있는 것 같지만 결과를 필터링하지 않습니다.

아쉽게도 짐작 하시겠지만 나는 제대로 작동하지 않습니다. 모든 것을 디버깅 할 때 엔티티에 필터가 추가되고 세션에서 필터가 사용 가능하게 설정되지만 모든 결과가 필터링됩니다.

나는 이런 식으로 설정했습니다

BuildConfig.groovy

grails.project.dependency.resolution = { 

    ... 

    plugins { 

     ... 

     compile ":hibernate-filter:0.3.2" 
    } 
} 

앱 Config.groovy 파일

import org.grails.plugin.hibernate.filter.HibernateFilterDomainConfiguration 

dataSource { 

    ... 

    configClass = HibernateFilterDomainConfiguration 
} 

MyDomainClass.groovy

class MyDomainClass extends MySuperClass { 

    ... 

    Boolean deleted = false 

    static hibernateFilters = { 
     deletedFilter(condition:"deleted=0", default:true) 
    } 

    ... 

} 

항상 위의 코드를 사용하여 MyController.groovy는

def list() { 

    ... 

    myDomainInstances = MyDomainClass.list() 
    [myDomainInstanceList: myDomainInstances, myDomainInstanceTotal: myDomainInstances.totalCount, ...] 
} 

모든 것이 제대로 구성 될 것으로 보인다 비록 나에게 필터링되지 않은 결과를 제공합니다. 응용 프로그램 시작을 디버깅 할 때 플러그인이 초기화되고 내 도메인 클래스를 검색하여 hibernateFilters 속성을 선택합니다. 이렇게하면 Hibernate 필터가 제대로 생성됩니다. 요청을 받으면 나는 Grails 필터가 시작되고 플러그인이 현재 Hibernate 세션의 모든 기본 필터 (광산)를 사용할 수 있음을 봅니다. 결과를 제외하고는 (SQL 로깅은 나를 백업하고, deleted에 대해서는 WHERE 절이 추가되지 않습니다) 모든 것이 예상대로 나타납니다 (최대 절전 모드 로깅에서 필터가 활성화 된 것을 볼 수 있습니다). 나는 또한 이전 버전을 시도했습니다

:

나는 또한 documentation 페이지의 지침을 따라 한

다음과 같은 시도 플러그인을 사용하고 플러그인 기능 (Foo.withHibernateFilters 등)을 사용하여 명시 적으로 필터를 활성화하려고했습니다.

그래도 여전히 붙어 있는데, Grails Hibernate Filter 플러그인을 사용하여 필터링 된 결과를 얻을 수있는 사람이 있습니까?

사용 된 소프트웨어 버전 :

  • Grails를 2.1.3
  • Grails의 2.1 최대 절전 모드.3
  • Grails는 Hibernate는 2.1.3 최대 절전 모드 버전 3.6.10을 사용하여 0.3.2
  • 자바에게 1.7.0_11
+0

나는 플러그인의 이슈 트래커에 문제를 추가 한 //jira.grails을 .org/browse/GPHIBERNATEFILTER-9 –

답변

1

Grails의 필터. Hibernate 3은 서브 클래스들 (예를 들어, 유니온 서브 클래스, 조인 서브 클래스)에 대한 필터를 지원하지 않는다. 위의 예에서 MySuperClass에 필터를 추가하면 작동합니다. Hibernate 4.1.5.SP1 및 이후 버전은 서브 클래스에 대한 필터를 지원할 것이다.

MySuperClass.groovy

class MySuperClass { 

    ... 

    Boolean deleted = false 

    static hibernateFilters = { 
     deletedFilter(condition:"deleted=0", default:true) 
    } 

    ... 

} 

MyDomainClass.groovy

class MyDomainClass extends MySuperClass { 

    ... 

} 

불행하게도, 위의 제대로 Hibernate documentation regarding filters 설명되어 있지 않습니다.

더 많은 정보 : HTTP :