我是Groovy和Grails的新手,但我对Hibernate非常熟悉。对于我正在处理的项目,我需要实现某些域类的软删除。 Hibernate Filters似乎是一个合适的解决方案,因为它允许我向我的域类添加一个条件,该条件将过滤掉软删除的记录,而无需我们手动为每个查询添加条件。幸运的是,Grails提供Hibernate Filter plugin,这样可以很容易地在Grails中使用Hibernate Filters。
不幸的是,正如你可能已经猜到的那样,我无法让它发挥作用。在调试时,所有内容似乎都已正确设置(过滤器被添加到实体中,过滤器正在会话等中启用)但是没有从结果中过滤掉任何内容。
我已经这样设置了:
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日志记录支持我,WHERE
没有添加deleted
子句。
我已按照documentation页面上的说明操作,并尝试了以下操作:
我还尝试过以前版本的插件,甚至尝试使用插件函数(Foo.withHibernateFilters
等)明确启用过滤器。
我仍然感到困惑,所以:有没有人可以使用Grails Hibernate Filter插件帮助我获得过滤结果?
二手软件版本:
答案 0 :(得分: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中正确记录。
更多信息: