blob: 21ac9e45c5fc515182792c901b848360097b26e9 [file] [log] [blame]
//
// 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".
. Щелкните правой кнопкой мыши узел "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. Снимите флажок "Использовать отдельную папку", если он установлен.
В рамках этого руководства копирование библиотек проекта в выделенную папку лишено смысла, поскольку совместное использование библиотек с другими пользователями не потребуется.
. Снимите флажок "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"]
. Щелкните "Добавить" в узле "Различные свойства" и выберите ``hibernate.query.factory_class`` в раскрывающемся списке "Имя свойства".
. Введите *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>
----
. Сохраните измененный файл.
После создания формы и настройки ее в качестве основного класса, вы сможете увидеть 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 с помощью мастера создания файлов"]
. Введите *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``
|===
. Сохраните изменения.
В режиме проектирования внешний вид формы выглядит так, как показано на следующем рисунке.
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"]
. Введите следующий запрос в редактор запросов 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%' )
----
. Откройте новую вкладку редактора 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 в файл, а затем изменить код.
. Добавьте следующие методы для создания запроса на основе строки со вводимой пользователем информацией.
[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()`` и создание запроса путем объединения строки запроса с информацией пользователя, вводимой в строку поиска.
. Добавьте метод ``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".
. Щелкните правой кнопкой мыши в редакторе и выберите 'Исправить выражения импорта' (Ctrl-Shift-I; ⌘-Shift-I в Mac) для создания операторов импорта для библиотек Hibernate ( ``org.hibernate.Query`` , ``org.hibernate.Session`` ) и ``java.util.List`` . Сохраните изменения.
. Создайте обработчик событий для кнопки "Query", переключившись в режим проектирования и дважды нажав кнопку "Query".
В среде IDE будет создан метод ``queryButtonActionPerformed`` , который затем отобразится в режиме просмотра исходного кода.
. Измените метод ``queryButtonActionPerformed`` в режиме просмотра исходного кода путем добавления следующего кода, обеспечивающего выполнение запроса при нажатии кнопки пользователем.
[source,java]
----
private void queryButtonActionPerformed(java.awt.event.ActionEvent evt) {
*if(!firstNameTextField.getText().trim().equals("")) {
runQueryBasedOnFirstName();
} else if(!lastNameTextField.getText().trim().equals("")) {
runQueryBasedOnLastName();
}*
}
----
. Добавьте следующий метод для просмотра результатов в "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));
}
----
. Щелкните правой кнопкой мыши в редакторе и выберите 'Исправить выражения импорта' (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="Установка главного класса в диалоговом окне 'Обзор главных классов'"]
. Нажмите кнопку "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``
Нажмите кнопку "Далее".
. Нажмите кнопку "Обзор" для открытия диалогового окна "Обзор папок репозитория".
. Разверните корневой узел и выберите *samples/java/DVDStoreAdmin-Ant*. Нажмите кнопку "ОК".
. Укажите локальную папку для исходных файлов (папка должна быть пустой).
. Нажмите кнопку "Завершить".
После нажатия кнопки "Готово" среда IDE инициализирует локальную папку в качестве репозитория Subversion и выполняет проверку исходных файлов проекта на выходе.
. Щелкните команду "Открыть проект" в диалоговом окне, которое появится после завершения проверки.
*Примечание.* Для получения исходных файлов на редактирование требуется клиент 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;*
}
----
. Щелкните правой кнопкой мыши в редакторе и выберите 'Вставить код' (Alt-Insert, Ctrl-I на Mac) и выберите методы получения и установки в контекстном меню для создания методов получения и установки для полей.
. В диалоговом окне "Generate Getters and Setters" выберите все поля и нажмите кнопку "Generate".
image::images/getters-setters.png[title="Диалоговое окно 'Создание методов получения и установки'"]
В диалоговом окне "Generate Getters and Setters" можно использовать стрелку вверх на клавиатуре для перемещения выбранного элемента к узлу "Actor", а затем нажать клавишу "пробел" и выбрать все поля "Actor".
. Исправьте операторы импорта и сохраните измененные данные.
После создания объекта 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>
----
. Сопоставьте поля в ``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>
----
. Нажмите кнопку "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 +]