corner imagecorner image
FeaturesPluginsDocs & SupportCommunityPartners

Сохранение состояния объектов Java на платформе Java EE 5

В этом документе представлены базовые аспекты разработки веб-приложений с сохранением состояния объектов Java™. Интерфейс API сохранения состояния объектов Java был разработан как часть платформы Java EE 5. В этом руководстве будет создан несложный проект веб-приложения. Несмотря на то, что в создаваемом проекте будет использоваться сохранение, благодаря интерфейсу API сохранения состояния объектов Java создавать для этой цели модуль EJB не потребуется.

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

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

В этом документе представлена среда IDE NetBeans, выпуск 6.1.

Предполагаемая продолжительность: 15 минут

Упражнения по темам руководства

Значок, указывающий на то, что содержимое этой страницы относится к среде IDE NetBeans 6.1

Для работы с этим руководством требуется программное обеспечение и ресурсы, перечисленные ниже.

Программное обеспечение или ресурс Требуемая версия
Среда IDE NetBeans Web & Java EE, версия 6.1
Комплект для разработчика на языке Java (JDK) версия 6 или
версия 5
Сервер приложений GlassFish V2

Для работы с этим руководством потребуется зарегистрировать в IDE локальный экземпляр сервера приложений Glass Fish/Sun Java System Application Server. Сервер приложений GlassFish поставляется вместе со средой IDE. Если сервер приложений был выбран для установки при установке среды IDE, то этот сервер уже должен быть зарегистрирован в среде IDE.

Предварительные условия

Предполагается, что читатель обладает базовыми знаниями по следующим технологиям или опытом программирования с их использованием:

  • Программирование на Java
  • Среда IDE NetBeans

Создание проекта веб-приложения

Целью этого упражнения является создание проекта веб-приложения "ZooApp". В этом приложении будут использоваться расширенные возможности модели сохранения состояния объектов Java. Одна из таких возможностей заключается в том, что объекты могут быть простыми классами Java, поэтому их больше не требуется помещать в модуль EJB и упаковывать в файл EAR. Это означает, что создавать классы объектов можно непосредственно в веб-приложении.

В этом руководстве для чтения и изменения данных в базе данных используются формы на страницах JavaServer Faces (JSF).

  1. Выберите "File > New Project" (Ctrl-Shift-N). Выберите "Web Application" в категории "Web" и нажмите кнопку "Next".
  2. Введите ZooApp в качестве имени проекта и укажите местоположение проекта.
  3. Снимите флажок "Use Dedicated Folder", если он выбран.
    В рамках этого руководства копирование библиотек проекта в выделенную папку лишено смысла, поскольку совместное использование библиотек с другими пользователями не потребуется.)
    Нажмите кнопку "Next".
  4. Выберите сервер "GlassFish" и установите в поле "Java EE Version" версию "Java EE 5". Нажмите кнопку "Next".
  5. Установите флажок "JavaServer Faces" и нажмите кнопку "Finish".

Заключение

В этом упражнении было создано веб-приложение для Java EE 5, содержащее классы объектов.

Создание единицы сохранения состояния

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

Единица сохранения состояния создается путем определения ее свойств в файле persistence.xml, который будет создан в веб-модуле. После указания имени единицы сохранения состояния укажите источник сохранения, используемый контейнером для управления экземплярами объектов. Кроме того, требуется указать источник данных и стратегию создания таблиц. Единица сохранения состояния будет создана с помощью мастера "New Persistence Unit".

Единицу сохранения состояния можно создать и в мастере "New Entity Class". При создании класса объектов мастер предложит создать единицу сохранения состояния, если она еще не создана.

Создание единицы сохранения состояния

  1. Щелкните правой кнопкой мыши узел веб-приложения "ZooApp" в окне "Projects" и выберите "New > Other" для открытия мастера создания файла.
  2. Выберите "Persistence Unit" в категории "Persistence" и нажмите кнопку "Next".
  3. Оставьте имя единицы (Persistence Unit Name) по умолчанию.
  4. В поле "Persistence Provider" выберите TopLink (default).

    По умолчанию используется источник TopLink Essential.jar. TopLink Essential.jar содержит библиотеки для сохранения состояния объектов Java. Необходимый диспетчер объектов находится в архиве TopLink Essential.jar.

  5. В качестве источника данных (Data Source) используйте источник данных по умолчанию jdbc/sample.

    Источник данных jdbc/sample уже настроен для подключения к базе данных Java DB, поставляемой с сервером приложений GlassFish. При использовании другой базы данных следует создать для нее новый источник данных.

  6. Убедитесь в том, что для единицы сохранения состояния используется интерфейс API транзакций Java, и что для стратегии создания таблиц (Table Generation Strategy) установлено значение "Create", т.е. на основании классов объектов при развертывании приложения создаются таблицы.
  7. Нажмите кнопку "Finish".
Мастер "New Persistence Unit"

После нажатия кнопки "Finish" в среде IDE создается файл persistence.xml, который открывается в редакторе исходного кода в режиме проектирования. Для просмотра XML файла persistence.xml можно нажать кнопку "XML" на панели инструментов редактора исходного кода. Этот файл содержит всю информацию, необходимую контейнеру Java EE 5 для управления объектами и сохранением состояния приложения.

Заключение

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

Создание классов объектов

В этом упражнении будут созданы два класса объектов, Animal.java и Pavilion.java, представляющие таблицы в создаваемой реляционной базе данных. Затем потребуется определить некоторые поля в классах, представляющих данные. Спецификация сохранения состояния объектов Java позволяет использовать аннотации для передачи информации о полях контейнеру, например, информации объектно-реляционного сопоставления.

Создание классов объектов Animal и Pavilion

Сначала потребуется создать классы объектов Animal и Pavilion. В базе данных классы представлены как таблицы ANIMAL и PAVILION.

При создании класса объектов в IDE добавляется аннотация @Entity, определяющая класс как класс объектов. После создания класса в классе создаются поля данных, которые должны содержаться в таблице, с аннотациями, содержащими дополнительную информацию по полям.

Каждый класс объектов должен обладать первичным ключом. При создании класса объектов в среде IDE добавляется аннотация @Id, указывающая поле, используемое в качестве первичного ключа. Также добавляется аннотация @Generated, указывающая стратегию создания ключа для основного идентификатора.

Для создания классов объектов необходимо выполнить следующие действия:

  1. Щелкните правой кнопкой мыши узел проекта "ZooApp" и выберите "New > Other".
  2. Выберите "Entity Class" в категории "Persistence" и нажмите кнопку "Next".
  3. Введите Animal в качестве имени класса, entity в качестве пакета и оставьте тип первичного ключа (Primary Key Type) Long. Нажмите кнопку "Finish".
  4. Повторите описанные выше действия для создания класса Pavilion в пакете исходного кода entity.

После нажатия кнопки "Finish" новый класс объектов открывается в редакторе исходного кода. Разверните узел entity в области "Source Packages" в окне "Projects" и проверьте находящиеся там классы объектов Animal и Pavilion.

Определение полей в классе Animal

Откройте класс Animal в редакторе и выполните следующие действия:

  1. Добавьте к классу следующие объявления полей (выделенные полужирным шрифтом):
    public class Animal implements Serializable {
    
        private static final long serialVersionUID = 1L;
        private Long id;
        private String name;
        private String kind;
        private String weight;
        private Pavilion pavilion;
  2. Щелкните правой кнопкой мыши в редакторе исходного кода и выберите "Insert Code" (Alt-Insert), а затем выберите "Getter and Setter" для открытия диалогового окна "Generate Getters and Setters".
  3. В диалоговом окне "Generate Getters and Setters" выберите все поля и нажмите кнопку "Generate".
    Диалоговое окно "Generate Getters and Setters"

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

  4. Теперь необходимо изменить имя одного из столбцов, которые будут созданы в таблице Animal, столбцу name присвоить имя animalName. Для указания имени созданного столбца можно использовать аннотации. Для этого добавьте следующую аннотацию над объявлением поля name:
       @Column(name="animalName")
        private String name;
  5. При аннотировании поля name аннотацией @Column в среде IDE выводится на экран предупреждение в левом поле рядом с идентификатором класса. Щелкните значок предупреждения в поле и выберите "Unify field access".
    Пример экрана редактора с окном "Unify field access"

    После выбора "Unify field access" средой IDE из метода получения getId будут перемещены аннотации @Id и @GeneratedValue.

    В результате аннотации окажутся непосредственно над private Long id.
  6. Столбец pavilion в таблице Animal должен также иметь связь "несколько к одному". Это может быть выполнено при помощи аннотаций путем добавления следующей аннотации над объявлением pavilion:
       @ManyToOne
        private Pavilion pavilion;
  7. Нажмите комбинацию клавиш Alt-Shift-I для создания любых необходимых операторов импорта для класса.
  8. Сохраните изменения.

В следующем действии будут определены поля в классе объектов Pavilion.

Определение полей в классе Pavilion

Откройте в редакторе класс Pavilion и выполните следующие действия:

  1. Добавьте к классу следующие объявления полей (выделенные полужирным шрифтом):
    public class Pavilion implements Serializable {
    
        private static final long serialVersionUID = 1L;
        private Long id;
        private String name;
        private String address;
        private Collection <Animal> animals;
  2. Добавьте следующую аннотацию над объявлением name для изменения имени создаваемого столбца:
       @Column(name="pavilionName")
        private String name;
  3. Добавьте следующую аннотацию над совокупностью animals для указания связи "один ко многим" для объекта:
       @OneToMany(mappedBy="pavilion")
        private Collection <Animal> animals;
  4. Щелкните правой кнопкой мыши в редакторе и выберите "Insert Code" (Alt-Insert), а затем выберите "Getter and Setter".
  5. В диалоговом окне "Generate Getters and Setters" выберите все поля и нажмите кнопку "Generate".
     Диалоговое окно "Generate Getters and Setters"
  6. Щелкните значок предупреждения на полях и выберите "Unify field access", как для класса "Animal".
  7. Нажмите комбинацию клавиш Alt-Shift-I для создания всех необходимых операторов импорта.
  8. Сохраните изменения.

Заключение

В этом упражнении было создано два класса объектов и определены поля. Кроме того, для определения свойств некоторых из столбцов в таблицах, которые будут созданы при развертывании приложения, были использованы аннотации.

Создание веб-интерфейса

Теперь необходимо будет создать несколько простых веб-страниц для проверки созданных таблиц базы данных и возможности добавления в них данные. В приложение будут добавлены страницы Java Server Faces (JSF) и для создания простого веб-интерфейса будут использованы страницы JSF из мастера создания класса объектов.

  1. Выберите в главном меню "File > New". Выберите "JSF Pages" из класса объектов в категории "Persistence" и нажмите кнопку "Next".
  2. В мастере "New JSF Pages from Entity Class" нажмите кнопку "Add All" для выбора двух классов объектов и затем нажмите кнопку "Next".
  3. Текстовое поле "Pages Folder JSF" оставьте пустым для сохранения файлов JSF в местоположении по умолчанию.
  4. Укажите entity в качестве пакета для создаваемых классов и нажмите кнопку "Finish".
    Мастер "New JSF Pages from Entity Class"

При нажатии кнопки "Finish" в IDE создаются необходимые файлы JavaServer Faces, после этого можно выполнить и протестировать приложение "ZooApp".

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

В этом упражнении будет развернут проект веб-приложения "ZooApp" и протестировано созданное приложение.

  1. Откройте базу данных Java DB щелчком правой кнопки мыши узла "JavaDB" в окне "Services" и выбором "Start Server".
  2. Щелкните правой кнопкой мыши узел проекта "ZooApp" и выберите "Run Project".

После нажатия кнопки "Run" в используемом обозревателе открывается страница с меню, отображающим список павильонов и животных.

 Диалоговое окно "Generate Getters and Setters"

На странице предусмотрены ссылки для просмотра, добавления, исправления или удаления данных о животных и павильонах.

Заключение

В этом упражнении было создано веб-приложение "ZooApp", предназначенное для платформы Java EE 5. Затем веб-приложение "ZooApp" было развернуто и протестировано.

Устранение проблем

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

Проблемы при работе с мастером "New JSF Pages from Entity Class"

При использовании мастера для создания страниц JSF из класса объектов может быть выдано следующее сообщение об ошибке:

This wizard can only be used in a web project with JSF support.

При получении такого сообщения следует убедиться, что к свойствам проекта добавлена инфраструктура Java Server Faces. Добавить поддержку веб-проектом Java Server Faces можно путем выполнения следующих действий:

  1. Щелкните правой кнопкой мыши узел веб-приложения в окне "Projects" и выберите "Properties".
  2. На экране "Categories" диалогового окна "Project Properties" выберите "Frameworks", а затем нажмите кнопку "Add".
  3. В диалоговом окне "Select Frameworks" выберите "Java Server Faces" и нажмите кнопку "OK".
  4. Для закрытия диалогового окна "Project Properties" нажмите кнопку "OK".

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

При изменении данных павильонов выдается IllegalArgumentException

Если на экране отображается следующее:

java.lang.IllegalArgumentException: Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectMany(animals). Found null.

Проблема, вероятно, заключается в неправильных методах получения и установки для Collection <Animal> в классе Pavilion.

Убедитесь, что методы получения и установки для Collection <Animal> выглядят следующим образом:

public Collection<Animal> getAnimals() {
    return animals;
}

public void setAnimals(Collection<Animal> animals) {
    this.animals = animals;
}

Если методы получения и установки в проекте указаны неверно, выполните следующие действия:

  1. Удалите классы "Controller" и "Converter" в классах объектов.
  2. Удалите каталоги animal и pavilion под узлом "Web Pages" в окне "Projects".
  3. Установите методы получения и установки в классе объектов Pavilion.
  4. Используйте мастер "JSF Pages from Entity Class" для повторного создания страниц JSF и классов "Controllers" и "Converter".


Что дальше?

Для получения дополнительных сведений об использовании среды IDE NetBeans 5.5 для разработки приложений для Java EE см. следующие ресурсы:

Дополнительная информация по использованию сохранения состояния объектов Java содержится в Руководстве по Java EE 5.

Оставить комментарии и предложения, обратиться за поддержкой и получить информацию о последних достижениях в области функциональных возможностей разработки для Java EE с помощью среды IDE NetBeans можно в списке рассылки nbj2ee.