我对Groovy和Grails很陌生,但我对Hibernate相当熟悉。对于我正在进行的项目,我需要实现、软删除某些域类的。Hibernate滤波器似乎是一个合适的解决方案,因为它允许我在域类中添加一个条件,它将过滤掉软删除的记录,而不需要我们手动向每个查询添加一个条件。幸运的是,Grails提供了一个Hibernate过滤器插件,可以方便地在Grails中使用Hibernate过滤器。
不幸的是,正如你可能已经猜到的那样,我无法让它开始工作。当调试一切看起来都正确的时候(过滤器被添加到实体中,过滤器在会话中被启用等等)。但是没有什么是从结果中过滤出来的。
我把它设成这样:
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属性。在此之后,它正确地创建Hibernate过滤器。当接收到请求时,我看到Grails过滤器正在启动,插件启用了当前Hibernate会话中的所有默认过滤器(我的是)。一切看起来都与我所期望的一样(我看到Hibernate的日志记录中启用了过滤器),除了结果( Everything在这里支持我,没有为deleted
添加任何deleted
子句)。
我遵循了文档页面上的说明,并尝试了以下操作:
我还尝试过这个插件的早期版本,甚至尝试使用插件函数(Foo.withHibernateFilters
等)显式地启用过滤器。
但是我还是被困住了,所以:可以帮助我使用Grails插件获得过滤结果吗?
使用的软件版本:
发布于 2013-03-12 06:15:25
Grails2.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文档中得到正确的记录。
更多信息:
https://stackoverflow.com/questions/15268370
复制相似问题