我是 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
)。
我已按照文档页面上的说明进行操作,并尝试了以下操作:
- 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 插件获得过滤结果?
使用的软件版本:
- 圣杯 2.1.3
- Grails 休眠 2.1.3
- Grails 休眠过滤器 0.3.2
- Java 1.7.0_11