Плагин Grails Hibernate Filters позволяет использовать Hibernate Filters с GORM . Фильтры гибернации предоставляют дополнительные правила ограничения, которые можно применять к классам и коллекциям. Плагин Hibernate Filters позволяет использовать эту функциональность с GORM внутри приложений Grails. Давайте посмотрим на пример, чтобы увидеть, как фильтры могут помочь нам.
Предположим, у нас есть следующий класс домена Grails:
1
2
3
4
|
class User { String username boolean locked } |
Флаг блокировки указывает, был ли пользователь заблокирован администратором по какой-либо причине. Предположим, что большинство частей нашего приложения должны обрабатывать заблокированных пользователей, поскольку они не существуют. Для этого мы могли бы добавить дополнительное условие, которое заботится о заблокированном флаге, ко всем запросам, которые используются для извлечения пользовательских объектов из базы данных. Однако это не будет хорошим решением по разным причинам (подумайте о СУХОЙ , что если у нас будет более одного флага?). Фильтры гибернации могут помочь в этой ситуации.
Установка плагина
Чтобы установить плагин Hibernate Filters в приложении Grails, нам нужно сделать две вещи:
- Добавьте зависимость плагина в BuildConfig.groovy:
1
compile
":hibernate-filter:0.3.2"
- Добавьте следующее свойство конфигурации в наше определение источника данных:
1234
dataSource {
...
configClass = HibernateFilterDomainConfiguration
}
Конфигурация фильтра
Теперь мы можем добавить фильтры в наш класс домена, используя статическое свойство hibernateFilters:
1
2
3
4
5
6
7
|
class User { String username boolean locked static hibernateFilters = { lockedFilter(condition: 'locked=0' , default : true ) } } |
Здесь мы определяем фильтр с именем 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' , default : true ) } } |
Здесь мы определяем фильтр с именем imagesVisibleFilter, который применяется к коллекции изображений по умолчанию. Условие фильтра будет применяться всякий раз, когда изображения данного пользователя извлекаются из базы данных. Если мы теперь получим доступ к коллекции изображений с помощью user.getImages (), мы получим только видимые изображения.
Вывод
Плагин Hibernate Filters предоставляет несколько удобных и простых утилит для добавления дополнительных ограничений к классам и коллекциям доменов. Возможность включить фильтры по умолчанию является хорошим улучшением по сравнению со стандартным Hibernate, в котором фильтры необходимо включать вручную для каждого экземпляра сеанса .