hibernate - Grails Hibernate Filters插件似乎正在运行,但未过滤结果

标签 hibernate grails gorm hibernate-filters

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

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

我已经这样设置了:

BuildConfig.groovy

grails.project.dependency.resolution = {

    ...

    plugins {

        ...

        compile ":hibernate-filter:0.3.2"
    }
}

app-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属性。之后,它会正确创建休眠过滤器。收到请求时,我看到Grails过滤器启动,并且插件启用了当前Hibernate session 中的所有默认过滤器(属于我的)。除了结果(SQL日志支持我,没有为WHERE添加deleted子句)外,所有内容都与我期望的一样(我在Hibernate的日志记录中看到启用了过滤器)。

我已按照documentation页面上的说明进行操作,还尝试了以下操作:
  • https://stackoverflow.com/a/6143422/236092
  • http://www.intelligrape.com/blog/2010/07/13/grails-hibernate-filter-plugin-a-life-saver/
  • https://stackoverflow.com/a/12467408/236092

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

    不过,我仍然陷于困境,所以:有人可以使用Grails Hibernate Filter插件帮助我获得过滤结果吗?

    使用的软件版本:
  • Grails 2.1.3
  • Grails休眠2.1.3
  • Grails休眠过滤器0.3.2
  • Java 1.7.0_11
  • 最佳答案

    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中正确记录。

    更多信息:
  • HHH-2394 Support filter tag in subclass
  • HHH-123 Filters for subclasses
  • Filters and subclasses
  • HHH-2394 Support filter tag in subclass - Pull Request
  • 关于hibernate - Grails Hibernate Filters插件似乎正在运行,但未过滤结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15268370/

    相关文章:

    java - hibernate不会创建表

    grails - Grails 2.3.2 GGTS 3.5无法在调试中工作

    hibernate - Grails 2.3.11错误pool.ConnectionPool-无法创建池的初始连接

    hibernate - 面对 `org.hibernate.hql.PARSER`使用executeQuery()方法从Grails中的数据库中获取数据时出错。请告诉我我做错了什么?

    xml - 正则表达式过滤器 log4j2

    java - hibernate 映射 - 无法在类中找到属性名称的 setter

    java - 意外的 GDS 异常 : 335544726. 从连接读取数据时出错

    grails - 在tagLib中使用方法调用语法时,如何将id传递给链接?

    grails - 在Grails中,如何在单元测试中模拟GrailsDomainBinder?

    grails - 如何在Grails中指定hasOne属性的表名