Статьи

Введение в Hibernate Filters

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

С Hibernate3 появился новый способ фильтрации результатов поиска. Иногда требуется обрабатывать только подмножество данных в базовых таблицах базы данных. Фильтры гибернации очень полезны в таких ситуациях. Другими подходами для решения таких проблем является использование представления базы данных или использование предложения WHERE в запросе или Hibernate Criteria API.

Но фильтры Hibernate могут быть включены или отключены во время сеанса Hibernate. Фильтры также могут быть параметризованы. Таким образом, можно управлять правилами «видимости» на уровне интеграции. Они могут использоваться в сценариях, где вам необходимо предоставить возможность ролей безопасности, прав или персонализации.

Когда использовать фильтры гибернации

Давайте рассмотрим пример, рассмотрим веб-приложение, которое создает отчеты для различных рейсов. В будущем, конечно, будет изменено требование, чтобы рейсы отображались в соответствии с их статусом (вовремя, с задержкой или отменой).

Это также можно сделать с помощью предложения WHERE в запросе SQL SELECT или запроса HQL SELECT Hibernate. Для небольшого приложения это нормально, но для большого и сложного приложения это может быть хлопотным. Более того, это будет похоже на поиск каждого SQL-запроса и внесение изменений в существующий код, которые были тщательно протестированы.

Это также можно сделать с помощью API Критерии Hibernate, но это также означает изменение кода во многих местах, и все это работает нормально. Более того, в обоих подходах нужно быть очень осторожным, чтобы они непреднамеренно не меняли существующие рабочие SQL-запросы.

Фильтры могут использоваться как представления базы данных, но параметризованы внутри приложения. Таким образом, они полезны, когда разработчики имеют очень мало контроля над операциями с БД. Здесь я собираюсь показать вам использование фильтров Hibernate для решения этой проблемы. Когда конечные пользователи выбирают статус, ваше приложение активирует статус рейса для сеанса Hibernate конечного пользователя. Любой запрос SQL вернет только подмножество рейсов с выбранным пользователем статусом. Статус рейса поддерживается в двух местах: сеанс гибернации и фильтр статуса рейса.

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

Примечание: это очень простое приложение, и ненужные сложности были устранены, чтобы лучше понять применение фильтров Hibernate. Пожалуйста, не стесняйтесь добавлять колокольчики самостоятельно в этот пример приложения.

Как использовать фильтры Hibernate

Фильтры Hibernate определены в документах отображения Hibernate (файл hbm.xml), которые просты в обслуживании. Можно программно включить или выключить фильтры в коде приложения. Хотя фильтры не могут быть созданы во время выполнения, они могут быть параметризованы, что делает их довольно гибкими по своей природе. Мы указываем фильтр для столбца, который используется для включения / отключения правил видимости. Пожалуйста, просмотрите пример приложения, в котором фильтр применяется к столбцу статуса рейса, и он должен соответствовать именованному параметру. После этого во время выполнения мы указываем одно из возможных значений.

Пример приложения

Пример приложения — очень элементарная система отчетности о полетах. Для полного понимания требуется предварительное знание Hibernate.

Пожалуйста, обратитесь к коду, приведенному в этой статье. Это можно импортировать как проект в Eclipse IDE. Вам нужно скачать hibernate3.jar под Hibernate Core. MySQL5 используется в качестве внутренней базы данных. MySQL драйвер, а именно. mysql-connector-java-5.1.6-bin.jar , Java 1.5 и Eclipse IDE необходимо загрузить из соответствующих источников.

В HibernateUtil.java абстрагировано большое количество деталей, касающихся работы с Hibernate, так что пользователи с очень небольшим опытом работы с Hibernate также могут использовать образец приложения. Файл ‘hibernate.cfg.xml’ может использоваться как есть. Это файл конфигурации Hibernate. Этот пример приложения готов к запуску, если у вас уже установлена ​​БД MySQL. Чтобы он работал с другими базами данных, вам нужно внести изменения в файл ‘hibernate.cfg.xml’. DDL также предоставляется как часть Zip-файла.

Начало работы с примером

Сначала определите фильтры в документах отображения Hibernate, используя XML-элемент <filter-def>. Эти определения фильтра должны содержать имя фильтра, а также имена и типы любых параметров фильтра. Укажите параметры фильтра с помощью XML-элемента <filter-param>. Параметры фильтра аналогичны именованным параметрам для запросов HQL. Нам нужно указать «:» (двоеточие) перед именем параметра / условием. Вот файл сопоставления из примера кода. 

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="data">   <class name="Flight" table="hibernate_filter_demo.flight_db">   <id name="id" type = "int" column="id">    <generator class = "increment"/>   </id>   <property name="flightNo" type="string" length="10" column="flight_No"/>   <property name="source" type="string" length="15" column="source"/>   <property name="destination" type="string" length="15" column="destination"/>     <property name="status" type="string" length="20" column="status"/>   <filter name="statusFilter" condition=":statusParam=status"/> </class>   <filter-def name="statusFilter">  <filter-param name="statusParam" type="string"/> </filter-def></hibernate-mapping>

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

Теперь присоедините фильтры к элементам отображения классов или коллекций. Вы можете прикрепить один фильтр к нескольким классам или коллекциям. Для этого вы добавляете XML-элемент <filter> в каждый класс или коллекцию. XML-элемент <filter> имеет два атрибута, а именно. имя и состояние. Имя ссылается на определение фильтра (в примере приложения это: statusFilter), а условие аналогично предложению WHERE в HQL. Пожалуйста, ознакомьтесь с полным файлом отображения гибернации из архива HibernateFilters.zip.

Примечание. Каждый элемент <filter> XML должен соответствовать элементу <filter-def>. Можно иметь более одного фильтра для каждого определения фильтра, и каждый класс может иметь более одного фильтра. Идея состоит в том, чтобы определить все параметры фильтра в одном месте, а затем связать их в отдельных условиях фильтра.

В коде Java мы можем программно включить или отключить фильтр. По умолчанию Hibernate Session не имеет включенных фильтров.

Интерфейс Session содержит следующие методы:

  • Открытый фильтр enableFilter (String filterName)

  • открытый фильтр getEnabledFilter (String filterName)

  • public void disableFilter (String filterName)

Интерфейс фильтра содержит некоторые важные методы:

  • открытый фильтр setParameter (имя строки, значение объекта)

  • открытый фильтр setParameterList (имя строки, значения коллекции)

  • открытый фильтр setParameterList (имя строки, значения объекта [])

Метод setParameter () чаще всего используется. Будьте внимательны и указывайте только тот тип Java-объекта, который вы упомянули в параметре во время определения фильтра в файле сопоставления.

Два метода setParameterList () полезны для использования предложений IN в ваших фильтрах. Если вы хотите использовать предложения BETWEEN, используйте два разных параметра фильтра с разными именами.

Теперь давайте посмотрим, что нам нужно сделать в коде Java.

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

public class HibernateFilterDemo{  public static void main(String argsp[])  {     SessionFactory factory = HibernateUtil.getSessionFactory();     Session session = factory.openSession();     insertData("DL6149", "RIC", "JFK", "ontime", session);     ....     Filter filter = session.enableFilter("statusFilter");     filter.setParameter("statusParam", "delayed");     showData(session);     ....     session.close();  }  public static void insertData(String flightNo, String source,                  String destination, String status, Session session)  {     session.beginTransaction();     ....     session.getTransaction().commit();  }  public static void showData(Session session)  {     session.beginTransaction();     Query query = session.createQuery("from Flight");     ....     session.getTransaction().commit();  }}

Пожалуйста, ознакомьтесь с исходным кодом, предоставленным в этой статье (HibernateFilters.zip). Он содержит сценарии DDL для создания таблиц в MySQL, Java Code, файла отображения и конфигурации Hibernate и параметров проекта затмения. Проект можно напрямую импортировать в Eclipse IDE. DDL может позволить вам работать с любой другой базой данных по вашему выбору. Пожалуйста, не стесняйтесь писать мне в случае каких-либо проблем с точки зрения выполнения этого образца приложения.

Вывод

Фильтры Hibernate являются одной из альтернатив представлений БД, предложением SQL where, Hibernate Criteria API. Это полезный способ отделения проблем базы данных от оставшегося кода приложения. Они помогают уменьшить сложность запросов HQL или SQL. Фильтры могут быть включены по мере необходимости. Наслаждайтесь работой с Hibernate Filters!

Ресурсы