// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Использование библиотеки Hibernate в приложении Java на базе Swing
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Использование библиотеки Hibernate в приложении Java на базе Swing - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Использование библиотеки Hibernate в приложении Java на базе Swing

В этом учебном руководстве IDE NetBeans используется для создания и развертывания приложения Swing Java, в котором отображаются данные из базы данных. Приложение использует библиотеку Hibernate в качестве слоя сохранения состояния для извлечения POJO (простых объектов Java) из реляционной базы данных.

Библиотека Hibernate предоставляет средства для объектно-реляционного сопоставления (ORM). В руководстве демонстрируется поддержка библиотеки Hibernate в среде IDE и использование мастеров для создания необходимых файлов Hibernate. После создания объектов Java и настройки приложения для использования Hibernate создается графический пользовательский интерфейс для поиска и отображения данных.

Приложение, создаваемое в этом курсе, представляет собой средство администрирования, дополняющее link:../web/hibernate-webapp.html[+веб-приложение "DVD Store"+]. В данном руководстве описывается создание приложения, позволяющего запрашивать подробные данные актера на основе соответствия имени или фамилии. При необходимости приложение можно расширить путем добавления функциональных возможностей запроса подробных данных о фильме, а также добавления/обновления/удаления объектов. В рамках руководства используется СУБД MySQL и база данных "Sakila", однако в приложениях Hibernate допускается использование любого поддерживаемого сервера базы данных. База данных "Sakila" представляет собой типовую базу данных, которая может быть загружена с сайта MySQL. Информация о настройке базы данных "Sakila" приведена в следующих разделах.

Перед изучением этого учебного курса можно ознакомиться со следующей документацией:

* Документация по библиотеке Hibernate по адресу link:http://www.hibernate.org/[+hibernate.org+]
* link:gui-functionality.html[+Введение в разработку графического интерфейса +]
* Учебный курс link:../ide/mysql.html[+Подключение к базе данных MySQL+].

Сведения о создании этого приложения с помощью Maven см. в разделе link:maven-hib-java-se.html[+Создание приложения Maven Swing с помощью Hibernate+].


image::images/netbeans-stamp-80-74-73.png[title="Содержимое этой страницы применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0"]


*Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.*

|===
|Программное обеспечение или материал |Требуемая версия 

|link:https://netbeans.org/downloads/index.html[+IDE NetBeans+] |7.2, 7.3, 7.4, 8.0, Java 

|link:http://java.sun.com/javase/downloads/index.jsp[+Комплект для разработчика на языке Java (JDK)+] |версия 7 или 8 

|link:http://www.mysql.com/[+Сервер базы данных MySQL+] |версия 5.x 

|База данных "Sakila" |подключаемый модуль, который можно получить в центре обновления 
|===

Можно загрузить link:https://netbeans.org/projects/samples/downloads/download/Samples/Java/DVDStoreAdmin-Ant.zip[+готовый проект в виде архива ZIP+].


== Создание базы данных

В этом учебном курсе используется база данных MySQL с названием  ``sakila`` . Пример базы данных не входит в устанавливаемую в среду IDE, поэтому перед изучением этого учебного курса необходимо создать базу данных.

База данных "Sakila" представляет собой свободно распространяемый пример базы данных, который можно загрузить с сайта MySQL. Для создания базы данных "Sakila" можно загрузить и установить подключаемый модуль "Sakila Sample Database" с использованием диспетчера подключаемых модулей. После установки подключаемого модуля можно создать базу данных "Sakila" в окне "Services". База данных "Sakila" будет добавлена к списку баз данных в диалоговом окне "Create MySQL database".

Для получения дополнительной информации о настройке среды IDE для работы с MySQL см. учебный курс link:../ide/mysql.html[+Подключение к базе данных MySQL+].

1. Откройте диспетчер подключаемых модулей и установите подключаемый модуль "Sakila Sample Database".
2. После установки подключаемого модуля, запустите сервера MySQL базы данных путем расширения узла 'Базы данных' в окне 'Службы', щелкните правой кнопкой мыши узел MySQL Server и выберите 'Запустить'.
3. Щелкните правой кнопкой мыши узел сервера MySQL и выберите Create Database ("Создать базу данных").
4. Выберите базу данных "Sakila"из раскрывающегося списка "New Database Name" в диалоговом окне "Create MySQL Database". Нажмите кнопку "ОК".
image::images/create-sakila-mysql.png[title="Снимок диалогового окна создания базы данных MySQL"]

При нажатии кнопки "OK" узел "Sakila" появится под узлом "MySQL Server".


[start=5]
. Щелкните правой кнопкой мыши узел "Sakila" и выберите "Connect".

После нажатия кнопки "Connect a database" под узлом "Databases" отобразится узел подключения к базе данных "Sakila" ( ``jdbc:mysql://localhost:3306/sakila [_username_ on Default]`` ). При открытом подключении для просмотра данных в базе данных разверните этот узел подключения.


== Создание проекта приложения Java на базе Swing

В этом упражнении будет создан простой проект приложения Java на базе Swing с именем "DVDStoreAdmin".

1. Выберите команду "Файл" > "Создать проект" (CTRL+SHIFT+N). Выберите приложение Java из категории Java и нажмите "Next".
2. Введите *DVDStoreAdmin* в качестве имени проекта и укажите местоположение проекта.
3. Снимите флажок "Использовать отдельную папку", если он установлен.
В рамках этого руководства копирование библиотек проекта в выделенную папку лишено смысла, поскольку совместное использование библиотек с другими пользователями не потребуется.

[start=4]
. Снимите флажок "Create Main Class". Нажмите кнопку "Завершить".

При нажатии кнопки "Finish" в среде IDE будет создан проект приложения Java. В проекте нет главного класса. Следует создать форму и установить ее в качестве главного класса.


== Добавление поддержки библиотеки Hibernate к проекту

Для добавления поддержки библиотеки Hibernate к проекту J2SE необходимо добавить библиотеку Hibernate в проект. Библиотека Hibernate входит в состав IDE и может быть добавлена к любому проекту. Для этого щелкните правой кнопкой мыши узел 'Библиотеки' в окне 'Проекты', выберите 'Добавить библиотеку', а затем выберите библиотеку Hibernate в диалоговом окне 'Добавить библиотеку'.

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


=== Создание файла настройки библиотеки Hibernate

Файл настройки библиотеки Hibernate ( ``hibernate.cfg.xml`` ) содержит информацию о подключении к базе данных, сопоставлениях ресурсов и других свойствах подключения. При создании файла настройки Hibernate с использованием мастера подключение к базе данных определяется путем выбора из списка подключений, зарегистрированных в среде IDE. В ходе создания файла настройки подробная информация о подключении и сведения о диалекте добавляются автоматически в соответствии с выбранным подключением к базе данных. В среде IDE библиотека Hibernate также автоматически добавляется в путь класса проекта. После создания файла настройки можно изменить файл с использованием редактора с несколькими представлениями или внести изменения в код XML непосредственно в редакторе XML.

1. Щелкните правой кнопкой мыши узел "Source Packages" в окне "Projects" и выберите "New > Other" для открытия мастера "New File".
2. Выберите элемент "Hibernate Configuration Wizard" из категории "Hibernate". Нажмите кнопку "Далее".
3. Оставьте значения по умолчанию на панели "Имя и местоположение" (создается файл в каталоге  ``src`` ). Нажмите кнопку "Далее".
4. Выберите подключение "sakila" из раскрывающегося списка "Database Connection". Нажмите кнопку "Завершить".
image::images/hib-config.png[title="Диалоговое окно для выбора подключения к базе данных"]

При нажатии кнопки "Finish" файл  ``hibernate.cfg.xml``  откроется в редакторе исходного кода в среде IDE. В среде IDE файл настройки создается в корне контекстного пути к классам приложения (в окне "Files", "WEB-INF/classes"). В окне 'Проекты' файл находится в исходном пакете  ``<пакет, заданный по умолчанию>`` . Файл настройки содержит информацию об отдельной базе данных. Если планируется подключение к нескольким базам данных, в проекте можно создать несколько файлов настройки (по одному для каждого сервера базы данных), но по умолчанию во вспомогательном служебном классе будет использоваться файл  ``hibernate.cfg.xml`` , расположенный в корневом каталоге.

После разворачивания узла "Libraries" в окне "Projects" видно, что к проекту добавлены требуемые архивы JAR библиотеки Hibernate и архив JAR соединителя MySQL.

image::images/hib-libraries-config.png[title="Снимок окна 'Проекты', в котором отображаются библиотеки Hibernate"]

*Примечание.* В среду NetBeans IDE 8.0 входят библиотеки Hibernate 4. Старые версии IDE, связанные с Hibernate 3.


=== Изменение файла настройки библиотеки Hibernate

В этом упражнении будут изменены свойства по умолчанию, указанные в  ``hibernate.cfg.xml`` , для включения функции протоколирования отладки для операторов SQL.

1. Откройте  ``hibernate.cfg.xml``  на вкладке "Проект". Для открытия файла можно развернуть узел "Configuration Files" в окне "Projects" и дважды щелкнуть  ``hibernate.cfg.xml`` .
2. Разверните узел "Configuration Properties" в области "Optional Properties".
3. Нажмите кнопку "Add" для открытия диалогового окна "Add Hibernate Property".
4. В диалоговом окне выберите свойство  ``hibernate.show_sql``  и установите значение  ``true`` . Нажмите кнопку "ОК". Это приведет ко включению протоколирования отладки операторов SQL.
image::images/add-property-showsql.png[title="Диалоговое окно 'Добавить свойство Hibernate', в котором отображаются значения настроек для свойства hibernate.show_sql"]

[start=5]
. Щелкните "Добавить" в узле "Различные свойства" и выберите  ``hibernate.query.factory_class``  в раскрывающемся списке "Имя свойства".

[start=6]
. Введите *org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory* в качестве значения свойства.

Класс 'translator factory' используется в библиотеке Hibernate 4, связанной с IDE.

Нажмите кнопку "ОК".

image::images/add-property-factoryclass-4.png[title="Диалоговое окно 'Добавить свойство Hibernate', в котором отображаются значения настроек для свойства hibernate.query.factory_class property"]

При использовании NetBeans IDE 7.4 или более ранней версии необходимо выбрать *org.hibernate.hql.classic.ClassicQueryTranslatorFactory* в качестве значения свойства в диалоговом окне. NetBeans IDE 7.4 и более ранние версии, связанные с библиотекой Hibernate 3.

image::images/add-property-factoryclass.png[title="Диалоговое окно 'Добавить свойство Hibernate', в котором отображаются значения настроек для свойства hibernate.query.factory_class property"]

При выборе вкладки "XML" в редакторе можно просмотреть файл в режиме XML. Файл должен выглядеть следующим образом:


[source,xml]
----

<hibernate-configuration>
    <session-factory name="session1">
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sakila</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">######</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property>
    </session-factory>
</hibernate-configuration>
----

[start=7]
. Сохраните измененный файл.

После создания формы и настройки ее в качестве основного класса, вы сможете увидеть SQL запросов, выведенные на печать в окне вывода IDE при выполнении проекта.


=== Создание вспомогательного файла  ``HibernateUtil.java`` 

Для использования библиотеки Hibernate необходимо создать вспомогательный класс для обработки запуска и обращения к  ``SessionFactory``  библиотеки Hibernate для получения объекта "Session". Класс обеспечивает вызов метода  ``configure()``  библиотеки Hibernate, загрузку файла настройки  ``hibernate.cfg.xml``  и последующую сборку  ``SessionFactory``  для получения объекта "Session".

В этом разделе для создания вспомогательного класса  ``HibernateUtil.java``  используется мастер создания файла.

1. Щелкните правой кнопкой мыши узел "Source Packages" и выберите "New > Other" для открытия мастера "New File".
2. Выберите "Hibernate" из списка "Categories" и "HibernateUtil.java" из списка "File Types". Нажмите кнопку "Далее".
image::images/hib-util.png[title="Описание создания HibernateUtil с помощью мастера создания файлов"]

[start=3]
. Введите *HibernateUtil* в качестве имени класса и *sakila.util* в качестве имени пакета. Нажмите кнопку "Завершить".

После нажатия кнопки "Finish" в редакторе откроется класс  ``HibernateUtil.java`` . Файл можно закрыть, т.к. необходимость в его изменении отсутствует.


== Создание файлов сопоставления библиотеки Hibernate и классов Java

В этом руководстве для отображения данных в таблице "ACTOR" базы данных используется простой старый объект Java (POJO)  ``Actor.java`` . Класс указывает поля для столбцов в таблицах и использует простые методы установки и получения значений для извлечения и записи данных. Для сопоставления  ``Actor.java``  с таблицей "ACTOR" можно использовать файл сопоставления библиотеки Hibernate или аннотации в классе.

Мастер обратного проектирования, файлы отображения библиотеки Hibernate и объекты POJO могут использоваться в мастере "Database" для создания нескольких объектов POJO и файлов отображения на основе выбранных таблиц базы данных. Кроме того, в среде IDE можно использовать мастеры для упрощения создания отдельных объектов POJO и файлов сопоставления "с нуля".

*Примечания.*

* При создании нескольких таблиц целесообразно использовать мастер. Однако в этом учебном курсе будет создан только один объект POJO и один файл отображения, поэтому можно создать эти файлы по отдельности. Действия по <<10,созданию объектов POJO и файлов сопоставления по отдельности>> приведены в конце данного учебного курса.


=== Создание файла обратного проектирования

Файл обратного проектирования ( ``hibernate.reveng.xml`` ) является файлом XML, который можно использовать для изменения настроек по умолчанию, примененных при создании файлов Hibernate из метаданных базы данных, определенной в  ``hibernate.cfg.xml`` . Мастер создает файл с основными настройками по умолчанию. Можно изменить файл и явным образом указать используемую схему базы данных, отфильтровать таблицы, которые не следует использовать, а также указать, как типы JDBC сопоставляются с типами Hibernate.

1. Щелкните правой кнопкой мыши узел "Source Packages" и выберите "New > Other" для открытия мастера "New File".
2. В списке "Categories" выберите "Hibernate", а в списке "File Types" выберите "Hibernate Reverse Engineering Wizard". Нажмите кнопку "Далее".
3. Введите имя файла *hibernate.reveng*.
4. В качестве местоположения оставьте значение по умолчанию * ``src`` *. Нажмите кнопку "Далее".
5. Выберите элемент *actor* на панели "Available Tables" и нажмите кнопку "Add". Нажмите кнопку "Завершить".

Мастер создает файл обратного проектирования  ``hibernate.reveng.xml`` . Файл обратного проектирования можно закрыть, поскольку его изменение не требуется.


=== Создание файлов сопоставления библиотеки Hibernate и объектов POJO на основе базы данных

Мастер создания файлов сопоставления библиотеки Hibernate и объектов POJO на основе базы данных создает файлы на основе таблиц, содержащихся в базе данных. При использовании этого мастера среда IDE создает объекты POJO и файлы отображения на основе таблиц базы данных, указанных в  ``hibernate.reveng.xml`` , а затем добавляет записи отображения в файл  ``hibernate.cfg.xml`` . При применении мастера можно выбрать файлы, которые должны быть созданы в среде IDE (например, только объекты POJO), и установить свойства создания кода (например, создание кода, использующего аннотации EJB 3).

1. Щелкните правой кнопкой мыши узел "Source Packages" в окне "Projects" и выберите "New > Other" для открытия мастера "New File".
2. Выберите "Hibernate Mapping Files and POJOs from a Database" в категории "Hibernate". Нажмите кнопку "Далее".
3. Выберите файл  ``hibernate.cfg.xml``  из раскрывающегося списка "Hibernate Configuration File", если он еще не выбран.
4. Выберите файл  ``hibernate.cfg.xml``  из раскрывающегося списка "Hibernate Reverse Engineering File", если он еще не выбран.
5. Убедитесь в том, что выбраны пункты *Domain Code* и *Hibernate XML Mappings*.
6. Введите *sakila.entity* в качестве имени пакета в поле "Package". Нажмите кнопку "Завершить".
image::images/mapping-pojos-wizard-ant.png[title="Мастер создания файлов сопоставления Hibernate и POJO"]

После нажатия кнопки "Finish" в среде IDE создается объект POJO  ``Actor.java``  со всеми необходимыми полями и файл сопоставления библиотеки Hibernate; кроме того, в файл  ``hibernate.cfg.xml``  добавляется запись сопоставления.

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


== Создание графического интерфейса пользователя приложения

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

При отсутствии знаний об использовании GUI Builder для создания форм можно ознакомиться с учебным курсом link:gui-functionality.html[+Введение в разработку графического интерфейса+].


=== Создание формы Jframe

1. Щелкните правой кнопкой мыши узел проекта в окне "Projects" и выберите "New > Other" для открытия мастера создания файла.
2. Выберите шаблон "JFrame Form" из категории "Swing GUI Forms". Нажмите кнопку "Далее".
3. Введите *DVDStoreAdmin* в поле "Class Name" и *sakila.ui* в поле "Package". Нажмите кнопку "Завершить".

После нажатия кнопки "Готово" в среде IDE создается класс, а в представлении "Дизайн" редактора открывается форма JFrame.


=== Добавление элементов к форме

Теперь необходимо добавить элементы пользовательского интерфейса к форме. При открытии формы в режиме проектирования в редакторе в левой части рабочей области среды IDE появляется палитра. Для добавления элемента к форме перетащите элемент с палитры в область формы. После добавления элемента к форме необходимо изменить значение по умолчанию свойства "Variable Name" для этого элемента.

1. Перетащите элемент "Label" из палитры и измените текст на *Actor Profile*.
2. Перетащите элемент "Label" с палитры и измените текст на *First Name*.
3. Перетащите элемент "Text Field", поместите его рядом с меткой "First Name" и удалите текст по умолчанию.
4. Перетащите элемент "Label" с палитры и измените текст на *Last Name*.
5. Перетащите элемент "Text Field", поместите его рядом с меткой "Last Name" и удалите текст по умолчанию.
6. Перетащите элемент "Button" с палитры и измените текст на *Query*.
7. Перетащите элемент "Table" с палитры в форму.
8. Измените значения "Variable Name" следующих элементов пользовательского интерфейса в соответствии со значениями, приведенными в следующей таблице.

Вы можете изменить значение 'Имя переменной' для элемента, щелкнув правой кнопкой мыши элемент в представлении конструктора и выбрав 'Изменить имя переменной'. Кроме того, значение "Variable Name" можно изменить непосредственно в окне "Inspector".

Присвоение значений "Variable Name" элементам "Label" не требуется.

|===
|Элемент |Имя переменной 

|Текстовое поле "First Name" | ``firstNameTextField``  

|Текстовое поле "Last Name" | ``lastNameTextField``  

|Кнопка "Query" | ``queryButton``  

|Таблица | ``resultTable``  
|===

[start=9]
. Сохраните изменения.

В режиме проектирования внешний вид формы выглядит так, как показано на следующем рисунке.

image::images/hib-jframe-form.png[title="Форма графического интерфейса пользователя в представлении проектирования редактора"]

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


== Создание запроса в редакторе запросов HQL Query Editor

В среде IDE создание и тестирование запросов на основе языка Hibernate Query Language (HQL) может осуществляться с использованием редактора запросов HQL Query Editor. После ввода запроса в редакторе отображается эквивалентный (переведенный) запрос SQL. При нажатии кнопки "Run HQL Query" на панели инструментов в среде IDE запрос выполняется, а результаты отображаются в нижней области редактора.

В этом упражнении редактор HQL Editor применяется для создания простых запросов HQL, позволяющих извлекать список подробных данных актеров на основе соответствия имени или фамилии. Перед добавлением запроса к классу редактор HQL Query Editor должен использоваться для проверки правильной работы подключения и корректности результатов запроса. Перед выполнением запроса необходимо скомпилировать приложение.

1. Правой кнопкой мыши щелкните узел проекта и выберите команду "Построить".
2. Разверните исходный узел пакета <default package> в окне "Projects".
3. Щелкните правой кнопкой мыши файл  ``hibernate.cfg.xml``  и выберите "Run HQL Query" для открытия редактора HQL Editor.
4. Протестируйте подключение путем ввода  ``from Actor``  в редакторе запросов HQL Query Editor. Нажмите кнопку 'Выполнить запрос HQL' ( image::images/run_hql_query_16.png[title="Кнопка 'Выполнить запрос HQL'"] ) на панели инструментов.

При нажатии кнопки "Run HQL Query" результаты запроса должны отображаться в нижней области редактора запросов HQL Query Editor.

image::images/hib-query-hqlresults.png[title="Редактор запросов HQL с отображением результатов запроса HQL"]

[start=5]
. Введите следующий запрос в редактор запросов HQL Query Editor и нажмите кнопку "Выполнить запрос HQL" для проверки результатов запроса при вводе значения "PE" в строку поиска.

[source,java]
----

from Actor a where a.firstName like 'PE%'
----

Запрос возвращает список подробных данных тех актеров, чьи имена начинаются с символов "PE".

При нажатии кнопки "SQL", размещенной над результатами, на экране должен отобразиться соответствующий эквивалентный запрос SQL.


[source,java]
----

select actor0_.actor_id as col_0_0_ from sakila.actor actor0_ where (actor0_.first_name like 'PE%' )
----

[start=6]
. Откройте новую вкладку редактора HQL Query Editor и введите следующий запрос на панели редактирования. Нажмите кнопку "Run HQL Query".

[source,java]
----

from Actor a where a.lastName like 'MO%'
----

Запрос возвращает список подробных данных актеров, чьи фамилии начинаются с символов "МО".

Тестирование запросов показывает, что запросы возвращают требуемые результаты. Теперь необходимо внедрить запросы в приложение и обеспечить вызов соответствующего запроса путем нажатия кнопки "Query" в форме.


== Добавление запроса к форме

Теперь необходимо изменить  ``DVDStoreAdmin.java``  для добавления строк запроса и создания методов, позволяющих формировать и вызывать запрос, включающий входные переменные. Также требуется изменить обработчик событий нажатия кнопок для вызова соответствующего запроса и добавить метод, обеспечивающий отображение результатов запроса в таблице.

1. Откройте  ``DVDStoreAdmin.java``  и выберите вкладку "Source".
2. Добавьте следующие строки запроса (выделенные полужирным шрифтом) к классу.

[source,java]
----

public DVDStoreAdmin() {
    initComponents();
}

*private static String QUERY_BASED_ON_FIRST_NAME="from Actor a where a.firstName like '";
private static String QUERY_BASED_ON_LAST_NAME="from Actor a where a.lastName like '";*
----

Запросы можно скопировать из вкладок редактора запросов HQL Query Editor в файл, а затем изменить код.


[start=3]
. Добавьте следующие методы для создания запроса на основе строки со вводимой пользователем информацией.

[source,java]
----

private void runQueryBasedOnFirstName() {
    executeHQLQuery(QUERY_BASED_ON_FIRST_NAME + firstNameTextField.getText() + "%'");
}
    
private void runQueryBasedOnLastName() {
    executeHQLQuery(QUERY_BASED_ON_LAST_NAME + lastNameTextField.getText() + "%'");
}
----

Эти методы обеспечивают вызов метода с именем  ``executeHQLQuery()``  и создание запроса путем объединения строки запроса с информацией пользователя, вводимой в строку поиска.


[start=4]
. Добавьте метод  ``executeHQLQuery()`` .

[source,java]
----

private void executeHQLQuery(String hql) {
    try {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Query q = session.createQuery(hql);
        List resultList = q.list();
        displayResult(resultList);
        session.getTransaction().commit();
    } catch (HibernateException he) {
        he.printStackTrace();
    }
}
----

Метод  ``executeHQLQuery()``  обеспечивает вызов библиотеки Hibernate для выполнения выбранного запроса. В этом методе служебный класс  ``HibernateUtil.java``  применяется для получения объекта Hibernate "Session".


[start=5]
. Щелкните правой кнопкой мыши в редакторе и выберите 'Исправить выражения импорта' (Ctrl-Shift-I; ⌘-Shift-I в Mac) для создания операторов импорта для библиотек Hibernate ( ``org.hibernate.Query`` ,  ``org.hibernate.Session`` ) и  ``java.util.List`` . Сохраните изменения.

[start=6]
. Создайте обработчик событий для кнопки "Query", переключившись в режим проектирования и дважды нажав кнопку "Query".

В среде IDE будет создан метод  ``queryButtonActionPerformed`` , который затем отобразится в режиме просмотра исходного кода.


[start=7]
. Измените метод  ``queryButtonActionPerformed``  в режиме просмотра исходного кода путем добавления следующего кода, обеспечивающего выполнение запроса при нажатии кнопки пользователем.

[source,java]
----

private void queryButtonActionPerformed(java.awt.event.ActionEvent evt) {
    *if(!firstNameTextField.getText().trim().equals("")) {
        runQueryBasedOnFirstName();
    } else if(!lastNameTextField.getText().trim().equals("")) {
        runQueryBasedOnLastName();
    }*
}
----

[start=8]
. Добавьте следующий метод для просмотра результатов в "JTable".

[source,java]
----

private void displayResult(List resultList) {
    Vector<String> tableHeaders = new Vector<String>();
    Vector tableData = new Vector();
    tableHeaders.add("ActorId"); 
    tableHeaders.add("FirstName");
    tableHeaders.add("LastName");
    tableHeaders.add("LastUpdated");

    for(Object o : resultList) {
        Actor actor = (Actor)o;
        Vector<Object> oneRow = new Vector<Object>();
        oneRow.add(actor.getActorId());
        oneRow.add(actor.getFirstName());
        oneRow.add(actor.getLastName());
        oneRow.add(actor.getLastUpdate());
        tableData.add(oneRow);
    }
    resultTable.setModel(new DefaultTableModel(tableData, tableHeaders));
}
----

[start=9]
. Щелкните правой кнопкой мыши в редакторе и выберите 'Исправить выражения импорта' (Ctrl-Shift-I; ⌘-Shift-I в Mac) для создания оператора импорта для  ``java.util.Vector``  и  ``java.util.List`` . Сохраните изменения.

После сохранения формы можно запустить проект.


== Выполнение проекта

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

1. Щелкните правой кнопкой мыши узел проекта в окне "Проекты" и выберите команду "Свойства".
2. Выберите категорию 'Выполнить' в диалоговом окне 'Свойства проекта'.
3. Введите *sakila.ui.DVDStoreAdmin* в поле "Main Class". Нажмите кнопку "ОК".

В качестве альтернативы можно нажать кнопку "Browse" и выбрать главный класс в диалоговом окне.

image::images/browse-main-class.png[title="Установка главного класса в диалоговом окне 'Обзор главных классов'"]

[start=4]
. Нажмите кнопку "Run Project" на главной панели инструментов для запуска приложения.

Введите информацию в строке поиска для текстовых полей "First Name" или "Last Name" и нажмите кнопку "Query" для поиска актера и просмотра подробных данных.

image::images/application-run.png[title="Приложение DVDStoreAdmin с отображением результатов"]

При вызове окна "Output" в среде IDE можно просмотреть запрос SQL, инициировавший извлечение представленных результатов.


=== Загрузка проекта решения

Решение для данного учебного курса в виде проекта можно загрузить несколькими способами.

* Загрузите link:https://netbeans.org/projects/samples/downloads/download/Samples/Java/DVDStoreAdmin-Ant.zip[+архив завершенного проекта в формате zip+].
* Выполните проверку исходных файлов проекта на выходе из примеров NetBeans, выполнив перечисленные ниже действия.
1. Выберите в главном меню "Группа > Subversion > Проверить".
2. В диалоговом окне "Проверка" введите следующий URL-адрес репозитория:
 ``https://svn.netbeans.org/svn/samples~samples-source-code`` 
Нажмите кнопку "Далее".

[start=3]
. Нажмите кнопку "Обзор" для открытия диалогового окна "Обзор папок репозитория".

[start=4]
. Разверните корневой узел и выберите *samples/java/DVDStoreAdmin-Ant*. Нажмите кнопку "ОК".

[start=5]
. Укажите локальную папку для исходных файлов (папка должна быть пустой).

[start=6]
. Нажмите кнопку "Завершить".

После нажатия кнопки "Готово" среда IDE инициализирует локальную папку в качестве репозитория Subversion и выполняет проверку исходных файлов проекта на выходе.


[start=7]
. Щелкните команду "Открыть проект" в диалоговом окне, которое появится после завершения проверки.

*Примечание.* Для получения исходных файлов на редактирование требуется клиент Subversion. Дополнительные сведения об установке Subversion см. в разделе link:../ide/subversion.html#settingUp[+Настройка Subversion+] в link:../ide/subversion.html[+Руководстве по Subversion в IDE NetBeans+].


== Создание объектов POJO и файлов сопоставления по отдельности

Поскольку POJO представляет собой простой класс Java, вы можете использовать мастер создания классов Java, чтобы создать класс, а затем изменить класс в редакторе исходного кода, чтобы добавить необходимые поля и методы получения и установки. После создания объекта POJO мастер также можно использовать для создания файла сопоставления библиотеки Hibernate, обеспечивающего сопоставления класса с таблицей, и добавления информации о сопоставлении в файл  ``hibernate.cfg.xml`` . При создании файла сопоставления "с нуля" необходимо сопоставить поля и столбцы в редакторе XML.

*Примечание.* Это упражнение является необязательным и описывает создание POJO и файла сопоставления, созданных с помощью файлов сопоставления библиотеки Hibernate и POJO из мастера баз данных.

1. Щелкните правой кнопкой мыши узел "Source Packages" в окне "Projects" и выберите "New > Java Class" для открытия мастера создания класса Java.
2. В мастере введите *Actor* в качестве имени класса и *sakila.entity* в качестве имени пакета. Нажмите кнопку "Завершить".
3. Внесите в класс следующие изменения (выделены полужирным шрифтом) для реализации интерфейса "Serializable" и добавьте поля для столбцов таблицы.

[source,java]
----

public class Actor *implements Serializable* {
    *private Short actorId;
    private String firstName;
    private String lastName;
    private Date lastUpdate;*
}
----

[start=4]
. Щелкните правой кнопкой мыши в редакторе и выберите 'Вставить код' (Alt-Insert, Ctrl-I на Mac) и выберите методы получения и установки в контекстном меню для создания методов получения и установки для полей.

[start=5]
. В диалоговом окне "Generate Getters and Setters" выберите все поля и нажмите кнопку "Generate".
image::images/getters-setters.png[title="Диалоговое окно 'Создание методов получения и установки'"]

В диалоговом окне "Generate Getters and Setters" можно использовать стрелку вверх на клавиатуре для перемещения выбранного элемента к узлу "Actor", а затем нажать клавишу "пробел" и выбрать все поля "Actor".


[start=6]
. Исправьте операторы импорта и сохраните измененные данные.

После создания объекта POJO для таблицы необходимо создать файл сопоставления библиотеки Hibernate для класса  ``Actor.java`` .

1. Щелкните правой кнопкой мыши узел исходных файлов  ``sakila.entity``  в окне "Projects" и выберите "New > Other" для открытия мастера создания файла "New File".
2. Выберите "Hibernate Mapping File" в категории "Hibernate". Нажмите кнопку "Далее".
3. Введите *Actor.hbm* в поле "File Name" и убедитесь в том, что выбрана папка *src/sakila/entity*. Нажмите кнопку "Далее".
4. Введите *sakila.entity.Actor* в поле "Class to Map" и выберите *actor* из раскрывающегося списка "Database Table". Нажмите кнопку "Завершить".
image::images/mapping-wizard.png[title="Мастер создания файлов сопоставления Hibernate"]

После выбора 'Готово' файл сопоставления Hibernate  ``Actor.hbm.xml``  открывается в редакторе исходного кода. Также в среде IDE выполняется автоматическое добавление записи для ресурса сопоставления в  ``hibernate.cfg.xml`` . В целях просмотра подробных данных разверните узел "Mapping" в режиме проектирования  ``hibernate.cfg.xml``  или в режиме XML. Запись  ``mapping``  в обзоре XML будет выглядеть следующим образом:


[source,xml]
----

        <mapping resource="sakila/entity/Actor.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
----

[start=5]
. Сопоставьте поля в  ``Actor.java``  со столбцами в таблице "ACTOR" путем внесения следующих изменений (выделены полужирным шрифтом) в  ``Actor.hbm.xml`` .

[source,xml]
----

<hibernate-mapping>
  <class name="sakila.entity.Actor" *table="actor">
    <id name="actorId" type="java.lang.Short">
      <column name="actor_id"/>
      <generator class="identity"/>
    </id>
    <property name="firstName" type="string">
      <column length="45" name="first_name" not-null="true"/>
    </property>
    <property name="lastName" type="string">
      <column length="45" name="last_name" not-null="true"/>
    </property>
    <property name="lastUpdate" type="timestamp">
      <column length="19" name="last_update" not-null="true"/>
    </property>
  </class>*
</hibernate-mapping>
----

Для заполнения значений при изменении файла сопоставления можно использовать функцию автозавершения кода.

*Примечание.* По умолчанию у созданного элемента  ``class``  имеется закрывающий тег. Поскольку элементы свойства необходимо добавить между открывающим и закрывающим тегами элемента  ``class`` , следует внести следующие изменения (выделены полужирным шрифтом). После внесения изменений можно использовать функцию автозавершения кода между тегами  ``class`` .


[source,xml]
----

<hibernate-mapping>
  <class name="sakila.entity.Actor" *table="actor">
  </class>*
</hibernate-mapping>
----

[start=6]
. Нажмите кнопку "Validate XML" на панели инструментов и сохраните изменения.

Создание объектов POJO и файлов сопоставления библиотеки Hibernate может эффективно использоваться для дальнейшей настройки приложения.

link:/about/contact_form.html?to=3&subject=Feedback:%20Using%20Hibernate%20in%20a%20Java%20Swing%20Application[+Отправить отзыв по этому учебному курсу+]



== Дополнительные сведения

Для получения дополнительных сведений о создании приложений с графическим интерфейсом пользователя на базе Swing см. следующие учебные курсы.

* link:quickstart-gui.html[+Разработка Swing GUI в IDE NetBeans+]
* link:gui-functionality.html[+Введение в разработку графического интерфейса +]
* link:../../trails/matisse.html[+Учебная карта по приложениям с графическим интерфейсом Java +]
