2013-03-07 2 views
2

Я новичок в Groovy и Grails, но я знаком с Hibernate. Для проекта, над которым я работаю, мне нужно реализовать soft deleting определенных классов домена. Hibernate Filters, похоже, было подходящим решением, так как это позволило бы мне добавить условие к моему классу домена, которое отфильтровывало бы мягкие удаленные записи, без необходимости вручную добавлять условие к каждому запросу. К счастью, Grails предлагает Hibernate Filter plugin, который должен облегчить использование фильтров Hibernate в Grails.Grails Hibernate Filters Plugin, похоже, работает, но не фильтрует результаты

К сожалению, как вы могли догадаться, я не могу заставить его работать. При отладке все кажется правильно настроенным (фильтры добавляются к объектам, фильтры включаются в сеансах и т. Д.), Но ничто не фильтруется из результатов.

Я поставил его так:

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. Все выглядит так, как я ожидал бы (я вижу, что фильтр включен в ведении журнала Hibernate), за исключением результатов (SQL-журнал задерживает меня в этом случае,клаузулы добавляются для deleted).

Я следовал инструкциям на documentation странице, а также попытался следующие:

Я также попытался предыдущих версий плагин и даже попытался явно включить фильтры, используя функции плагинов (Foo.withHibernateFilters и т. д.).

Я все еще застрял, поэтому: может ли кто-нибудь помочь мне получить результаты фильтрации с помощью плагина Grails Hibernate Filter?

Б версии программного обеспечения:

  • Grails 2.1.3
  • Grails Hibernate 2.1.3
  • Grails Hibernate фильтр 0.3.2
  • Java 1.7.0_11
+0

Я добавил вопрос для отслеживания проблем плагина: HTTP: //jira.grails .org/просмотр/GPHIBERNATEFILTER-9 –

ответ

1

Grails 2.1.3 использует Hibernate версию 3.6.10. 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.

Дополнительная информация: