grails更改过滤器
Grails的Hibernate Filters插件使将Hibernate Filters与GORM结合使用成为可能。 Hibernate过滤器提供了可应用于类和集合的其他限制规则。 Hibernate Filters插件使Grails应用程序中的GORM可以使用此功能。 让我们看一个例子,看看过滤器如何帮助我们。
假设我们有以下Grails域类:
class User {
String username
boolean locked
}
锁定标志指示用户是否由于某种原因被管理员锁定。 假设我们的应用程序的大多数部分都应将锁定的用户视为不存在的用户。 为此,我们可以向用于从数据库检索User对象的所有查询添加一个附加条件,该条件负责锁定标志。 但是,由于多种原因,这不是一个好的解决方案(想想DRY ,如果我们有多个标志怎么办?)。 在这种情况下,Hibernate筛选器可以提供很好的帮助。
插件安装
要将Hibernate Filters插件安装在Grails应用程序中,我们必须做两件事:
- 将插件依赖项添加到BuildConfig.groovy中:
compile ":hibernate-filter:0.3.2"
- 将以下配置属性添加到我们的dataSource定义中:
dataSource { ... configClass = HibernateFilterDomainConfiguration }
过滤器配置
现在,我们可以使用静态hibernateFilters属性将过滤器添加到我们的域类中:
class User {
String username
boolean locked
static hibernateFilters = {
lockedFilter(condition: 'locked=0', default: true)
}
}
在这里,我们定义了一个名称为lockedFilter的过滤器。 过滤器默认情况下处于启用状态,这意味着当我们向数据库查询User对象时,将始终应用该条件。
// returns only users that are not locked
List users = User.findAll()
// returns null if the user is locked
User john = User.findByUsername('John')
但是,有一个例外:即使给定ID的用户已被锁定,User.get(id)也会返回User对象。 要在按ID检索User时应用过滤器,我们必须使用User.findById(id)。
在某些情况下,我们可能需要所有用户,甚至需要锁定的用户(例如在管理界面中)。 在这里,我们可以使用noHibernateFilter方法来禁用过滤器:
User.withoutHibernateFilter('lockedFilter') {
// get all users, including locked users
List allUsers = User.findAll()
}
过滤集合
Hibernate过滤器也可以用来过滤集合。 假设用户能够在我们的应用程序中上传图像。 这些图像保存在我们的User域类的集合中:
class User {
...
static hasMany = [images: Image]
}
class Image {
boolean visible
static belongsTo = [user: User]
}
通过将Image的visible属性设置为false,管理员可以隐藏不适当的图像。 可见标记设置为false的图像不应在任何地方使用(类似于锁定的用户)。 我们在这里面临的问题是,默认情况下user.getImages()返回给定用户的所有图像。
过滤器可以再次帮助我们:
class User {
...
static hasMany = [images: Image]
static hibernateFilters = {
...
imagesVisibleFilter(collection: 'images', condition: 'visible=1', default: true)
}
}
在这里,我们定义了一个名为imagesVisibleFilter的过滤器,该过滤器默认情况下应用于图像集合。 每当从数据库中检索给定用户的图像时,将应用过滤条件。 如果现在使用user.getImages()访问图像集合,则仅获得可见图像。
结论
Hibernate Filters插件提供了一些简单易用的实用程序,用于为域类和集合添加其他限制。 与标准的Hibernate(需要为每个Session实例手动启用过滤器)相比,默认情况下启用过滤器是一种不错的改进。
翻译自: https://www.javacodegeeks.com/2014/01/grails-using-hibernate-filters.html
grails更改过滤器