Grails:使用休眠过滤器

通过Grails的Hibernate Filters插件 ,可以将GOBERHibernate Filters一起使用。 休眠过滤器提供了可应用于类和集合的其他限制规则。 Hibernate Filters插件使Grails应用程序中的GORM可以使用此功能。 让我们看一个例子,看看过滤器如何帮助我们。

假设我们具有以下Grails域类:

class User {
  String username
  boolean locked
}

锁定标志指示用户是否由于某种原因被管理员锁定。 假设我们的应用程序的大多数部分都应将锁定的用户视为不存在的用户。 为此,我们可以向用于从数据库检索User对象的所有查询添加一个附加条件,该条件负责锁定标志。 但是,由于多种原因,这不是一个好的解决方案(想想DRY ,如果我们有多个标志怎么办?)。 在这种情况下,Hibernate筛选器可以提供很好的帮助。

插件安装

要将Hibernate Filters插件安装在Grails应用程序中,我们必须做两件事:

  1. 将插件依赖项添加到BuildConfig.groovy中:
    compile ":hibernate-filter:0.3.2"
  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()
}

过滤集合

休眠过滤器也可以用来过滤集合。 假设用户能够在我们的应用程序中上传图像。 这些图像保存在我们的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值