Статьи

Программирование объектной базы данных с использованием JPA и NetBeans

Я разрабатывал Java-приложения в течение долгого времени, и основная трудность заключалась в части программирования, связанной с манипулированием базой данных. Недавно я перешел на использование объектно-реляционного отображения через JPA. Я использовал TopLink , EclipseLink и Hibernate . Я мог бы легко достичь желаемой функциональности, не беспокоясь о разработке базы данных. Я также использовал некоторые объектные базы данных, такие как neoDatis, которые не нуждаются в объектно-реляционном отображении. Наконец, я нашел ObjectDB , базу данных объектов для Java, которая поддерживает JPA.

В этой статье показано, как создать простое стандартное приложение JAVA в NetBeans с использованием ObjectDB и JPA. Продемонстрированное приложение использует JPA для хранения и извлечения объектов двух классов сущностей из Embedded ObjectDB. Он продемонстрирует возможности ObjectDB и JPA, которые включают в себя сохранение объектов, удаление сохраненных объектов и получение сохраненных объектов. Для этого учебного пособия, кроме Java JDK и IDE NetBeans , вам нужно только загрузить и извлечь zip-файл распространения ObjectDB . Дистрибутив zip содержит все необходимое без какой-либо внешней зависимости.

Этот учебник состоит из следующих шагов:

  • Шаг 1. Создайте JavaD-проект с поддержкой ObjectDB

  • Шаг 2: Определите классы сущностей JPA

  • Шаг 3: Добавить основной класс

  • Шаг 4: Разработка графического интерфейса пользователя

  • Шаг 5: код пользовательских методов

  • Шаг 6: Кодовые события элементов управления

  • Шаг 7: Запустите программу


Шаг 1. Создание проекта с поддержкой ObjectDB

Мы начнем с создания нового проекта NetBeans.

В меню выберите « Файл»> «Создать», чтобы открыть диалоговое окно [Новый проект].

Выберите «   Java»  из категорий и «  Java-приложение»  из проектов и нажмите «   Далее».

Выберите название проекта (например,   город

Установите для имени класса Main значение  main.Main — при  этом будет создан пакет с именем main и класс Java с именем Main с общедоступным static void main (String [] args) {}

Нажмите Готово, чтобы создать проект.

Затем необходимо добавить поддержку ObjectDB / JPA в проект.

Загрузите установочные файлы ObjectDB со страницы загрузки . Загруженный файл .zip-файл objectdb- (версия) должен быть извлечен в папку, например D: \ Program Files \ ObjectDB.

Найдите проект в  окне проекта . Если окно проекта не видно, нажмите Ctrl + 1, чтобы открыть окно проекта. Щелкните правой кнопкой мыши проект, чтобы открыть всплывающее меню, и выберите «Свойства», чтобы открыть окно [Свойства проекта] .

Нажмите на Библиотеки под категориями окна свойств проекта. В данный момент на вкладке «Компиляция» нет библиотек.

Нажмите « Добавить Jar / Папка» и найдите файл objectdb.jar в папке bin извлеченного каталога ObjectDB.

Это добавит файл objectdb.jar в библиотеки, и теперь в проекте включена поддержка JPA / ObjectDB.

Шаг 2: Определите классы сущностей JPA

Сначала мы создадим новый пакет с именем ‘bean’ для включения классов сущностей.

Щелкните правой кнопкой мыши узел City или Source Packages, чтобы открыть всплывающее меню, и выберите New. Недавние выборы перечислены и найти пакет Java.

Если его нет в списке во всплывающем меню, выберите « Другое», чтобы открыть окно [Новый файл]  . Выберите « Java» в разделе « Категоризация» и « Пакет Java» в «Типах файлов».

В окне « Новый пакет Java» введите bean в качестве имени пакета и убедитесь, что в качестве местоположения выбраны «Исходные пакеты». Затем нажмите Готово, чтобы создать пакет.

Мы можем создать классы Entity, создав класс Java и добавив аннотацию @Entity чуть выше линии определения класса. NetBeans также позволяет нам напрямую добавлять класс сущностей.

Чтобы создать новый класс сущностей, щелкните правой кнопкой мыши по bean-компоненту и выберите New > Entity Class . Если класс сущностей отсутствует в списке последних типов, выберите « Другое», чтобы открыть окно « Новый файл» . Выберите Постоянство в категории и Класс сущности в качестве типа файла.

В окне New Entity Class введите City в качестве имени класса. Убедитесь, что боб выбран в качестве пакета. По умолчанию выбран модуль создания персистентности и снимите его, поскольку необязательно иметь блок персистентности для работы с ObjectDB. В этом уроке мы не используем постоянный модуль. Затем нажмите « Готово», чтобы создать класс State Entity.

Вы увидите, что NetBeans создал большую часть кода для нас, и мы можем отредактировать код в соответствии с нашими потребностями.

package bean;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Country implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Country)) {
            return false;
        }
        Country other = (Country) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "bean.Country[id=" + id + "]";
    }

}

 

Класс, сгенерированный NetBeans, реализует интерфейс Serializable, и он не является обязательным при работе с ObjectDB . Поэтому мы можем смело удалять

  • импорт java.io.Serializable (полная строка — нет 3) и
  • реализует Serializable (в строке № 10)

из сгенерированного кода.

Сгенерированный код создал поле идентификатора в строке от 12 до 14. Поскольку нам нужен уникальный последовательно увеличивающийся идентификатор для каждого вновь созданного объекта страны, мы должны изменить @GeneratedValue (стратегии = GenerationType.AUTO) на @GeneratedValue (стратегии = GenerationType). IDENTITY).

Это гарантирует, что при сохранении нового объекта Country будет автоматически добавлен уникальный последовательный идентификатор, специфичный для типа Country.

Нам нужно добавить поле String с именем ‘name’ в качестве свойства к классу Country. Добавить строковое имя; в строке № 15 вышеуказанной кодировки. Необходимо добавить getter и setter к новому свойству. Нажмите Alt + Ins, чтобы получить код вставки кода меню и выберите геттер и сеттер

Затем проверьте [name: String] и нажмите Generate, чтобы вставить геттеры и сеттеры.

Мы также должны изменить метод toString, чтобы он возвращал название страны.

Наконец, новая кодировка Country Entity будет выглядеть следующим образом.

package bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Country {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Country)) {
            return false;
        }
        Country other = (Country) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return name;
    }

}

 

 

Следующим шагом является создание класса New Entity с именем City. Необходимо выполнить те же самые шаги выше, а затем добавить следующие модификации. Чуть ниже, где имя String; вставлен, введите Страна страна; Это означает, что каждый объект, созданный из класса City, имеет ссылку на другой постоянный объект из страны сущности. У любого города есть только одна страна. Но одна страна может иметь любое количество городов. Так что есть отношения один ко многим. Прямо над местом мы определяем страну страны; в City Entity Class мы должны добавить аннотацию @ManyToOne. Как только мы закончим набирать страну страны; NetBeans предупреждает нас о необходимости добавления аннотации, и все, что нам нужно, чтобы выбрать правильную [Создать одностороннее отношение ManyToOne]. Генерация геттера и сеттера для страны Страны; как описано выше.

Наконец, новая кодировка объекта City будет выглядеть следующим образом.

 

package bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class City{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    String name;
    @ManyToOne
    Country country;

    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof City)) {
            return false;
        }
        City other = (City) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return name;
    }

}

 

 

Шаг 3: Дизайн GUI

Мы должны создать графический интерфейс пользователя в качестве внешнего интерфейса, чтобы позволить пользователю хранить и извлекать данные. В этом примере слева находится список городов, а при щелчке по городу детали отображаются справа. Для простоты детали города ограничены названием города и страны, к которой он принадлежит. После выбора города мы можем нажать кнопку « Изменить» , чтобы начать изменение сведений о выбранном городе. Мы можем выбрать страну и затем нажать кнопку « Удалить» , чтобы удалить ее из списка. Когда мы нажимаем кнопку « Добавить» , мы можем начать вводить данные, чтобы добавить новый город. Если мы не нажмем Изменить или Добавить Кнопка, детали города не могут быть изменены.

Хотя сведения о городе добавляются или изменяются после нажатия кнопок « Добавить» или « Редактировать» , мы не можем выбрать города из списка lstCity, поскольку он отключен (режим редактирования). После редактирования сведений или ввода новых сведений о городе мы можем нажать кнопку « Сохранить» , чтобы сохранить их, или кнопку « Отмена» , чтобы отменить изменения. style = ‘mso-spacerun: yes’> Это снова позволит нам выбрать любой город из lstCity . (Выберите режим)

Существует текстовое поле для ввода новой страны, и если мы нажмем кнопку « Добавить новую страну» , эта страна будет добавлена ​​в существующий список стран.

Кнопка Закрыть в нижнем нижнем углу формы завершит работу приложения.

Щелкните правой кнопкой мыши узел City или Source Packages, чтобы открыть всплывающее меню, и выберите New . Недавние выборы перечислены и найти пакет Java . Если его нет в списке, выберите « Другое», чтобы открыть окно « Новый файл» . Выберите Java в списке категорий, а затем пакет Java в списке типов файлов. Затем мы получим окно New Java Package . Введите имя типа « gui » в пакет, который мы собираемся хранить в этом пакете. Убедитесь, что в качестве местоположения выбраны Source Packages, а затем нажмите кнопку Готово.

Щелкните правой кнопкой мыши по пакету графического интерфейса , чтобы открыть всплывающее меню. Выберите New, а затем JFrame . Если JFrame не указан в списке, выберите « Другое», чтобы открыть окно « Новый файл», и выберите « Swing GUI Forms» из категорий, а затем « JFrame» из «Типы файлов», чтобы открыть окно « Новая форма JFrame» . Введите имя, например, frmCity, и, убедившись, что в качестве пакета выбран графический интерфейс , нажмите кнопку Готово .

Окно проектов покажет frmCity в пакете gui. Дважды щелкните на frmCity или щелкните правой кнопкой мыши на frmCity и выберите «Открыть», чтобы создать форму. Перетащите следующие компоненты из палитры компонентов в форму, чтобы создать следующий вид. Если палитра компонентов не видна с правой стороны, выберите  меню «Окно», а затем « Сбросить Windows» . Чтобы изменить текст, отображаемый на элементах управления, щелкните правой кнопкой мыши компонент и выберите « Изменить текст» . Щелкните правой кнопкой мыши элемент управления и выберите « Изменить имя переменной», чтобы изменить имя элемента управления, которое используется в кодировании для идентификации элементов управления.

 Составная часть  имя  Текст
 JLabel  lblCities Города
 JList  lstCity  
 JButton  btnAdd Добавить
 JButton  btnEdit редактировать
 JButton  btnDelete удалять
 JTextField  txtCountry  
 JButton  btnAddNewCountry Добавить новую страну
 JLabel  lblCity город
 JTextField  txtCity  
 JComboBox  cmbCountry  
 JButton  btnSave Сохранить
 JButton  btnCancel Отмена
 JButton  btnClose Закрыть

Шаг 4: код основного метода

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

Откройте файл Main.java в основном пакете. Существует открытый метод static void main, и внутри него мы должны вызвать JFrame frmCity для отображения. Следующий код должен быть добавлен.

 

package main;

import gui.frmCity;

public class Main {

    public static void main(String[] args) {
        frmCity city = new frmCity();
        city.setVisible(true);
    }

}

Строка 3 импортирует файл frmCity, поскольку он находится внутри другого пакета, чем файл Main.java.

В строке 8 создается новый объект из класса frmCity, а на следующей строке отображается форма.

Затем нажмите F6 или выберите « Выполнить и запустить проект (город)» в меню. Это также можно сделать, нажав кнопку « Воспроизвести» на панели инструментов «Выполнить» .

Если разработанная нами форма не отображается, проверьте, является ли Проект основным проектом. Вы можете щелкнуть правой кнопкой мыши на City Project и выбрать Set as Main Project .

Если форма все еще не отображается, откройте « Свойства проекта» и просмотрите « Выполнить» и убедитесь, что в качестве основного класса выбран Main.main .

Шаг 5: код пользовательских методов

Теперь мы должны добавить функциональность в этот проект. Хотя в идеале функциональность должна быть добавлена ​​в виде отдельных классов менеджера, для простоты все необходимое кодирование выполняется внутри самого frmCity.

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

Существующие города перечислены в списке. При нажатии информация о выбранном городе отображается справа. Если мы хотим отредактировать детали, мы должны нажать btnEdit . Если мы хотим добавить новый город, нужно нажать btnAdd . После нажатия btnAdd или btnEdit , можно ввести название города в txtCity и выберите страну из cmbCountry . Пока мы не нажмем btnSave или btnCancel , мы не сможем получить доступ к lstCity, btnAdd или btnEdit . Если щелкнуть btnSave , детали будут сохранены, и программа снова перейдет в режим выбора.

Если мы введем название страны в txtCountry и нажмем на btnAddNewCountry , новая страна будет сохранена и появится в cmbCountry .

 btnClose закроет приложение при нажатии.

Их функциональные возможности закодированы в несколько методов многократного использования.

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

Импорт заключается в следующем.

import bean.City;
import bean.Country;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;

 

 

Соединение с базой данных JPA представлено интерфейсом EntityManager . style = ‘mso-spacerun: yes’> Для подключения требуется база данных. Аналогично, нам нужен экземпляр EntityManagerFactory, чтобы получить экземпляр EntityManager . EntityManagerFactory представляет базу данных. Когда нам нужны какие-либо изменения в базе данных, нам нужен экземпляр EntityTransaction .

Один EntityManagerFactory может иметь любое количество EntityManager , то есть существует отношение один ко многим. Один EntityManager может иметь только одну EntityTransaction, и это отношение один к одному.

Поскольку программа работает с одной базой данных, один экземпляр EntityManagerFactory — это все, что необходимо для всей программы. Он будет эффективно управлять всеми соединениями, представленными несколькими экземплярами EntityManager .

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

Поскольку существует только один объект EntityManagerFactory для всей программы, он должен иметь область видения приложения. EntityManager должен иметь доступ ко всем методам в классе. В этом руководстве мы определяем как EntityManager, так и EntityManagerFactory как переменные уровня класса.

Для начала мы можем определить EntityManagerFactory и присвоить нулевое значение. Затем определите EntityManager и присвойте ему также нулевое значение.

Сразу под первой строкой класса мы можем определить их, как показано ниже.

EntityManager em = null;
EntityManagerFactory emf = null;

 

 

Если вы еще не сделали импорт, EntityManager и EntityManagerFactory будут подчеркнуты красным. В начале строки появляется лампочка («Исправляемый намек»), и, если мы наведем на нее курсор мыши, появится надпись «Не удается найти символ». Если нажать на подсказку, выберите «Добавить импорт для Javax.persistence.EntityManager».

Когда программа запускается, мы должны проверить, существует ли существующий экземпляр EntityManagerFactory , и если нет, мы можем создать один экземпляр. Затем мы проверяем, является ли экземпляр EntityManager и, если он недоступен, мы создаем новый из EntityManagerFactory .

Постоянство Java требует имя единицы сохраняемости в качестве параметра при создании EntityManagerFactory . Но если мы разрабатываем приложение Embedded ObjectDB, мы можем просто использовать относительный или абсолютный путь к базе данных с расширением * .odb вместо имени модуля постоянства. Это закодировано в методе, называемом «connectDatabase».

 

    private void connectDatabase() {
        if (emf == null) {
            emf = Persistence.createEntityManagerFactory("city.odb");
        }
        if (em == null) {
            em = emf.createEntityManager();
        }
    }

 

Если в этом месте уже существует действительный файл ObjectDB , программа будет использовать его. style = ‘mso-spacerun: yes’> Если такой базы данных нет, она будет создана на месте. Когда просто дается имя базы данных, база данных создается в папке проекта NetBeans. style = ‘mso-tab-count: 1’> Поскольку мы используем встроенную базу данных, допускается одно соединение за раз. Если мы хотим использовать несколько одновременных соединений через соединение TCP / IP, мы можем легко определить модуль постоянства и добавить эту функциональность, как описано в другом учебном пособии.

Все страны должны быть перечислены в cmbCountry . Когда форма впервые отображается и когда добавляется новая страна, этот JCombo должен быть пополнен. Заполнение этой JCombo странами осуществляется методом, который называется fillCountries. Этот код заполнит JCombo объектами, полученными из JPA. Убедитесь, что вы добавили правильный импорт в начале, а именно javax.persistence.Query и javax.swing.DefaultComboBoxModel .

Элементы, уже добавленные в JCombo, можно очистить с помощью метода cmbCountry.removeAllItems ().

Сначала мы создаем экземпляр TypedQuery из EntityManager . style = ‘mso-spacerun: yes’> При создании экземпляра запроса мы можем указать один из нескольких параметров, включая строковый тип JPAQuery, который используется в этом примере. JPA-запрос очень похож на SQL, но более гибкий. Запрос «SELECT cu FROM Country cu ORDER BY cu.name» может извлечь все объекты типа Country из базы данных, упорядоченной по атрибуту name. Результаты могут быть назначены списку (java.util.List), который, в свою очередь, преобразуется в массив объектов типа Country. Новый экземпляр DefaultComboBoxModel создается с этими объектами и назначается в качестве модели JComboBox. Это заполнит cmbCountry всеми сохраненными объектами страны.

    private void fillCountries() {
        cmbCountry.removeAllItems();
        try {
            TypedQuery query = em.createQuery("SELECT cu FROM Country cu ORDER BY cu.name", Country.class);
            List countryList = query.getResultList();
            Object[] countries = countryList.toArray();
            DefaultComboBoxModel dcm = new DefaultComboBoxModel(countries);
            cmbCountry.setModel(dcm);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(rootPane, e);
        }
    }

    

 

 

Все города перечислены в lstCity, и это делается внутри метода fillCities . Как описано ранее, JPA Query будет извлекать все объекты городского типа. Мы можем напрямую передать эти объекты в JList с помощью метода lstCity.setListData (towns).

private void fillCities() {
        DefaultListModel dlm = new DefaultListModel();
        dlm.removeAllElements();
        lstCity.setModel(dlm);
        try {
            TypedQuery query = em.createQuery("SELECT ci FROM City ci ORDER BY ci.name" , City.class);
            List cityList = query.getResultList();
            Object[] cities = cityList.toArray();
            lstCity.setListData(cities);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(rootPane, e);
        }

    }

 

 

Когда город выбран в lstCity, информация о выбранном городе отображается справа, а метод вызова указан ниже. Города хранятся в JList, и мы выбираем пользователя и отображаем детали. Мы могли бы получить объект непосредственно из базы данных, но в этом примере это не обязательно.

    private void displayCityDetails() {
        City city = (City) lstCity.getSelectedValue();
        if (city != null) {
            txtCity.setText(city.getName());
            cmbCountry.setSelectedItem(city.getCountry());
        }
    }

 

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

    private void clearCityDetails() {
        txtCity.setText(null);
        cmbCountry.setSelectedItem(null);
    }

 

Когда окно отображается в первый раз, мы можем выбрать любой город, но мы не можем редактировать его или добавлять новый, пока мы намеренно не нажмем кнопку « Изменить » или кнопку « Добавить » соответственно. Элементы управления подготовлены к такому редактированию, как указано в следующем методе.

    private void setToEdit() {
        btnAdd.setEnabled(false);
        btnEdit.setEnabled(false);
        btnDelete.setEnabled(false);

        lstCity.setEnabled(true);

        btnSave.setEnabled(true);
        btnCancel.setEnabled(true);

        txtCity.setEditable(true);
        cmbCountry.setEnabled(true);
    }

    

 

 

После редактирования или добавления нового города мы можем сохранить изменения, нажав кнопку « Сохранить », или игнорировать изменения, нажав кнопку « Отмена ». После этого окно переходит в состояние, в котором мы можем выбрать город, но не можем его редактировать. Это достигается с помощью следующего набора кодов.

 

    private void setToSelect() {
        btnAdd.setEnabled(true);
        btnEdit.setEnabled(true);
        btnDelete.setEnabled(true);

        lstCity.setEnabled(true);

        btnSave.setEnabled(false);
        btnCancel.setEnabled(false);

        txtCity.setEditable(false);
        cmbCountry.setEnabled(false);
    }

 

Шаг 6: Кодовые события элементов управления

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

Получите представление проекта для frmCity JFrame и щелкните правой кнопкой мыши на нем, избегая каких-либо элементов управления. style = ‘mso-spacerun: yes’> Выберите Events , Window и windowOpened [formWindowOpened], чтобы получить блок кода, в котором мы можем написать все, что мы должны делать при открытии окна. Мы вызываем методы, необходимые для подключения к базе данных, для заполнения cmbCountry списком стран, для заполнения lstCity городами и для подготовки формы к выбору состояния, как показано ниже.

    private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
        connectDatabase();
        fillCountries();
        fillCities();
        setToSelect();
    }                                 

 

 

Как описано ранее, получите событие btnAddNewCountryActionPerformed и включите этот код, необходимый для добавления новой страны в базу данных.

 

    private void btnAddNewCountryActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        Country country = new Country();
        country.setName(txtCountry.getText());
        em.getTransaction().begin();
        em.persist(country);
        em.getTransaction().commit();
        fillCountries();
        txtCountry.setText(null);
    }                                                

 

 Напишите, нажмите на lstCity , выберите Events , ListSelection и valueChanged, чтобы получить lstCityValueChanged .

 

    private void lstCityValueChanged(javax.swing.event.ListSelectionEvent evt) {                                     
        displayCityDetails();
    }                                    

 

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

 

    private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {                                       
        clearCityDetails();
        lstCity.clearSelection();
        setToEdit();
        txtCity.requestFocus();
    }                                      

 

 

 btnEdit подготовит форму для редактирования выбранной страны. Когда пользователь редактирует город, выбор города отключен, но он может изменить детали по мере необходимости. Следующий код внутри btnEditActionPerformed достигает этого.

 

 

    private void btnEditActionPerformed(java.awt.event.ActionEvent evt) {                                        
        if (lstCity.getSelectedValue() == null) {
            JOptionPane.showMessageDialog(null, "Select one to edit");
            lstCity.requestFocus();
        } else {
            setToEdit();
            txtCity.requestFocus();
            txtCity.selectAll();
        }
    }                                       

 

Код под ActionPerformed из btnDelete удалит выбранный элемент из базы данных. Удаление объекта вносит изменения в базу данных, поэтому для начала нам нужно получить экземпляр EntityTransaction. Объект помечается для удаления при вызове em.remove и при вызове метода commit экземпляра EntityTransaction объект физически удаляется из базы данных.

 

    private void btnDeleteActionPerformed(java.awt.event.ActionEvent evt) {                                          
        City city = (City) lstCity.getSelectedValue();
        if (city == null) {
            JOptionPane.showMessageDialog(null, "Select one to delete");
            lstCity.requestFocus();
            return;
        } else {
            em.getTransaction().begin();
            em.remove(city);
            em.getTransaction().commit();
        }
        fillCities();
        clearCityDetails();
        setToSelect();
        lstCity.requestFocus();
    }                                         

    

 

 btnSave сохранит новый объект, если пользователь ранее нажал кнопку «Добавить». Если кнопка «Редактировать» была нажата ранее, она обновит изменения, внесенные в выбранный объект. При нажатии кнопки «Добавить» выбор в lstCity очищается. В этом случае lstCity.getSelectedValue () возвращает нулевое значение. В этом случае он создает новый экземпляр города и назначает введенные пользователем значения. Теперь мы собираемся сохранить вновь созданный объект. Поскольку это изменяет базу данных, мы должны получить экземпляр EntityTransaction их EntityManager и вызвать метод begin. Когда мы вызываем метод persist экземпляра EntityManager, он отмечает объект, который будет сохранен в базе данных. Никаких физических изменений не происходит, пока мы не вызовем метод commit EntityTransaction, который сохраняет объект в базе данных.

Нажатие кнопки «Редактировать» не отменяет выбор lstCity, и lstCity.getSelectedValue () возвращает объект города. В этом случае новые атрибуты, введенные пользователем, передаются этому объекту. Мы получаем EntityTransaction и вызываем метод begin. Так как em — это тот же EntityManager, который получил объект города, который мы собираемся обновить, нам не нужно заказывать его для явного сохранения. Просто вызов метода commit EntityTransaction обновит объект в базе данных новыми значениями. Значение идентификатора НЕ может быть обновлено, и это вызовет исключение. Если мы вызовем метод persist другого EntityManager, этот же объект будет рассматриваться как новый объект, и обновление не будет происходить, как ожидалось. Мы должны использовать метод commit, связанный с тем же EntityManager, который мы использовали для его получения.

    private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {                                        
        City city = (City) lstCity.getSelectedValue();
        if (city == null) {
            city = new City();
            city.setCountry((Country) cmbCountry.getSelectedItem());
            city.setName(txtCity.getText());
            em.getTransaction().begin();
            em.persist(city);
            em.getTransaction().commit();
        } else {
            em.getTransaction().begin();
            city.setCountry((Country) cmbCountry.getSelectedItem());
            city.setName(txtCity.getText());
            em.getTransaction().commit();
        }
        fillCities();
        setToSelect();
        lstCity.requestFocus();
    }                                       

 btnCancel просто очищает введенные значения и позволяет приложению выбирать города.

 

    private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {                                          
        clearCityDetails();
        setToSelect();
    }                                         

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

 

    private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {                                         
        System.exit(1);
    }                                        

 

 

Шаг 7: Запустите программу

Мы завершили все кодирование. NetBeans также создал несколько кодов для нас, когда JFrame и элементы управления добавляются в приложение. Если вы запустите приложение, вы получите все функциональные возможности. Если есть какая-либо ошибка, сначала проверьте, добавили ли вы поддержку ObjectDB, как описано выше.

Вы можете скачать исходный код с или без библиотек из этой статьи.