我是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页面上的说明进行操作,还尝试了以下操作:
我还尝试了插件的先前版本,甚至尝试使用插件功能(
Foo.withHibernateFilters
等)显式启用过滤器。不过,我仍然陷于困境,所以:有人可以使用Grails Hibernate Filter插件帮助我获得过滤结果吗?
使用的软件版本:
最佳答案
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中正确记录。
更多信息:
关于hibernate - Grails Hibernate Filters插件似乎正在运行,但未过滤结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15268370/