2

我是 Groovy 和 Grails 的新手,但我对 Hibernate 非常熟悉。对于我正在处理的项目,我需要实现某些域类的软删除Hibernate Filters似乎是一个合适的解决方案,因为它允许我向我的域类添加一个条件,该条件将过滤掉软删除的记录,而无需我们手动为每个查询添加条件。幸运的是,Grails 提供了一个Hibernate Filter 插件,它可以让在 Grails 中使用 Hibernate Filters 变得容易。

不幸的是,正如您可能已经猜到的那样,我无法让它工作。调试时,一切似乎都已正确设置(将过滤器添加到实体,在会话中启用过滤器等),但没有从结果中过滤任何内容。

我已经这样设置了:

BuildConfig.groovy

grails.project.dependency.resolution = {

    ...

    plugins {

        ...

        compile ":hibernate-filter:0.3.2"
    }
}

应用程序配置.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 日志记录支持我,没有WHERE添加任何子句deleted)。

我已按照文档页面上的说明进行操作,并尝试了以下操作:

我也尝试过以前版本的插件,甚至尝试使用插件功能(Foo.withHibernateFilters等)显式启用过滤器。

不过,我仍然卡住了,所以:谁能帮助我使用 Grails Hibernate Filter 插件获得过滤结果?

使用的软件版本:

  • 圣杯 2.1.3
  • Grails 休眠 2.1.3
  • Grails 休眠过滤器 0.3.2
  • Java 1.7.0_11
4

1 回答 1

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 文档中没有正确记录上述内容。

更多信息:

于 2013-03-12T06:15:25.297 回答