Статьи

Grails: использование фильтров Hibernate

Плагин Grails Hibernate Filters позволяет использовать Hibernate Filters с GORM . Фильтры гибернации предоставляют дополнительные правила ограничения, которые можно применять к классам и коллекциям. Плагин Hibernate Filters позволяет использовать эту функциональность с GORM внутри приложений Grails. Давайте посмотрим на пример, чтобы увидеть, как фильтры могут помочь нам.

Предположим, у нас есть следующий класс домена Grails:

1
2
3
4
class User {
  String username
  boolean locked
}

Флаг блокировки указывает, был ли пользователь заблокирован администратором по какой-либо причине. Предположим, что большинство частей нашего приложения должны обрабатывать заблокированных пользователей, поскольку они не существуют. Для этого мы могли бы добавить дополнительное условие, которое заботится о заблокированном флаге, ко всем запросам, которые используются для извлечения пользовательских объектов из базы данных. Однако это не будет хорошим решением по разным причинам (подумайте о СУХОЙ , что если у нас будет более одного флага?). Фильтры гибернации могут помочь в этой ситуации.

Установка плагина

Чтобы установить плагин Hibernate Filters в приложении Grails, нам нужно сделать две вещи:

  1. Добавьте зависимость плагина в BuildConfig.groovy:
    1
    compile ":hibernate-filter:0.3.2"
  2. Добавьте следующее свойство конфигурации в наше определение источника данных:
    1
    2
    3
    4
    dataSource {
      ...
      configClass = HibernateFilterDomainConfiguration
    }

Конфигурация фильтра

Теперь мы можем добавить фильтры в наш класс домена, используя статическое свойство hibernateFilters:

1
2
3
4
5
6
7
class User {
  String username
  boolean locked
  static hibernateFilters = {
    lockedFilter(condition: 'locked=0'defaulttrue)
  }
}

Здесь мы определяем фильтр с именем lockedFilter. Фильтр включен по умолчанию, что означает, что условие будет всегда применяться, когда мы запрашиваем базу данных для пользовательских объектов.

1
2
3
4
5
// returns only users that are not locked
List users = User.findAll() 
 
// returns null if the user is locked
User john = User.findByUsername('John')

Однако есть одно исключение: User.get (id) вернет объект User, даже если пользователь для данного идентификатора был заблокирован. Чтобы применить фильтр при извлечении пользователя по идентификатору, мы должны использовать User.findById (id).

В некоторых ситуациях нам могут понадобиться все пользователи, даже заблокированные (например, в интерфейсе администрирования). Здесь мы можем использовать методlessHibernateFilter, чтобы отключить наш фильтр:

1
User.withoutHibernateFilter('lockedFilter') {
1
2
3
// get all users, including locked users
  List allUsers = User.findAll()
}

Фильтрация коллекций

Фильтры гибернации также можно использовать для фильтрации коллекций. Предположим, пользователи могут загружать изображения в нашем приложении. Эти изображения сохраняются в коллекции в нашем классе домена пользователя:

1
2
3
4
class User {
  ...
  static hasMany = [images: Image]
}
1
2
3
4
class Image {
  boolean visible
  static belongsTo = [user: User]
}

Администраторы могут скрывать неподходящие изображения, установив для свойства visible видимое значение false. Изображения с видимым флагом, установленным в false, не должны использоваться нигде (аналогично заблокированным пользователям) Проблема, с которой мы здесь сталкиваемся, заключается в том, что user.getImages () возвращает все изображения данного пользователя по умолчанию.

Фильтры могут помочь нам здесь снова:

1
2
3
4
5
6
7
8
class User {
  ...
  static hasMany = [images: Image]
  static hibernateFilters = {
    ...
    imagesVisibleFilter(collection: 'images', condition: 'visible=1'defaulttrue)
  }
}

Здесь мы определяем фильтр с именем imagesVisibleFilter, который применяется к коллекции изображений по умолчанию. Условие фильтра будет применяться всякий раз, когда изображения данного пользователя извлекаются из базы данных. Если мы теперь получим доступ к коллекции изображений с помощью user.getImages (), мы получим только видимые изображения.

Вывод

Плагин Hibernate Filters предоставляет несколько удобных и простых утилит для добавления дополнительных ограничений к классам и коллекциям доменов. Возможность включить фильтры по умолчанию является хорошим улучшением по сравнению со стандартным Hibernate, в котором фильтры необходимо включать вручную для каждого экземпляра сеанса .