Статьи

Как использовать Hibernate с аннотациями на платформе NetBeans

В этом руководстве я хочу показать вам, как использовать Hibernate с аннотациями в приложении на платформе NetBeans .

Ниже я использую тот же пример, который использовался в учебнике по DZone Константином Драбо . Учебное пособие, которое вы сейчас читаете, призвано стать альтернативой использованию Hibernate с файлами XML. Я не хочу оценивать одну из возможностей как «лучшую». Это полностью зависит от вашего личного вкуса.

Мы начнем с небольшого примера администрирования пациентов, который Geertjan показал нам, как создать на сертифицированном тренинге NetBeans Platform в Брауншвейге :

Как видите, у нас есть четыре модуля:

  • ПациентБрендинг для брендинга меню
  • PatientModel с информацией о пациенте
  • PatientEditor для создания и редактирования пациента
  • PatientViewer для отображения узлов пациента

В качестве первого шага мы добавляем новый модуль-обертку библиотеки с именем Hibernate. В главном меню мы нажимаем Файл -> Новый проект -> Модули NetBeans, а затем выбираем «Модуль библиотечного обертки».

Затем мы выбираем библиотеки, которые нам нужны:

 

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

Нажмите Далее и дайте этому модулю имя проекта «Hibernate» и базу кодовых имен «org.jboss.hibernate».

Когда вы нажмете кнопку «Готово», вы увидите, что модуль добавлен в «Приложение пациента».

После этого нам нужно создать новый модуль с именем «DatabaseConnection». База кодовых имен может быть чем-то вроде «de.patient.databaseconnection» или чем-то еще, что вы хотите использовать для уникальной идентификации.

В этом модуле нам нужно добавить папку «META-INF» с файлом «persistence.xml»:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="Patientlist" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>de.patient.model.Patient</class>
    <properties>
<property name="hibernate.connection.username" value="username"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.password" value="password"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/patientdb"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

Этот файл настраивает соединение с базой данных и классы, которые мы хотим сохранить.

После этого мы добавляем пакет с именем «log4j», который будет содержать файл «log4j.properties».

Мы щелкаем правой кнопкой мыши по пакету и выбираем New -> Others -> Other -> Property File, используя имя «log4j».

В этом файле мы добавляем следующую конфигурацию:

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=warn, stdout

Теперь у нас есть готовая конфигурация, и мы можем добавить зависимость в модуль DatabaseConnection, чтобы он мог использовать модуль Hibernate.

Щелкните правой кнопкой мыши модуль в окне «Проекты», выберите «Свойства» и перейдите на вкладку «Библиотеки». Там добавьте зависимость, чтобы мы могли отфильтровать модуль Hibernate, который мы уже добавили в наше приложение. Мы нажимаем ОК, и вы должны увидеть это:

Теперь мы добавляем файл Java в пакет «de.patient.databaseconnection». Назовите его «DatabaseEntityManager.java», с таким содержанием:

package de.patient.databaseconnection;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

public class DatabaseEntityManager {

static {
getEntityManager();
}

public DatabaseEntityManager() {
}
private static EntityManagerFactory entityManagerFactory;
private static EntityManager entityManager;

public static EntityManager getEntityManager() {

if (entityManager == null) {
try {
entityManagerFactory = javax.persistence.Persistence.
createEntityManagerFactory("Patientlist");
} catch (java.lang.IllegalStateException ex) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex1) {
Logger.getLogger(DatabaseEntityManager.class.getName()).
log(Level.SEVERE, null, ex1);
}
getEntityManager();
}
entityManager = entityManagerFactory.createEntityManager();
}
return entityManager;
}

public static EntityManagerFactory getEntityManagerFactory() {
if (entityManagerFactory == null) {
entityManagerFactory = javax.persistence.Persistence.createEntityManagerFactory("Patientlist");
entityManager = entityManagerFactory.createEntityManager();
}
return entityManagerFactory;
}
}

После этого нам нужно сделать этот пакет общедоступным, чтобы другие классы могли получить к нему доступ. Мы щелкаем правой кнопкой мыши по модулю в окне «Projects», выбираем Properties, затем выбираем API Versioning и затем устанавливаем флажок «Public Packages», как показано ниже: 

 

 Теперь наш проект должен выглядеть так:

 

Теперь мы добавляем класс сущности, который мы хотим сохранить. Для этого нам нужно только добавить зависимость в модуль Hibernate в модуле PatientModel … и затем добавить несколько строк в существующий класс «Patient.java».

В классе «Patient.java» измените эту строку:

public class Patient {  

 … к этой строке:

@Entity
public class Patient implements Serializable {

А также обязательно добавьте оператор импорта для «java.io. Serializable».

Затем добавьте атрибут ID:

@Id
@GeneratedValue
private Integer patientId;

Наконец, нам нужно добавить конструктор по умолчанию в класс:

public Patient() {

}

Это все, что нам нужно настроить в классе Patient.

Далее, давайте добавим функцию «Обновить» в «PatientViewer», иначе мы не увидим, что наша недавно добавленная функция фактически работает.

Откройте модуль «PatientViewer», а затем откройте класс «PatientEditorTopComponent».

Далее ищите эти три утверждения в конструкторе:

        Children kids = Children.create(new PatientChildFactory(), true
em.setRootContext(new RootNode(kids));
associateLookup(ExplorerUtils.createLookup(em, getActionMap()));

 Вместо вышеизложенного мы создаем новую функцию:

        public void refreshNode() {
    Children kids = Children.create(new PatientChildFactory(), true);
    em.setRootContext(new RootNode(kids));
     }

А затем удалите первые два оператора из трех операторов, которые вы нашли в конструкторе, и вместо этого получите следующее:

refreshNode();
associateLookup(ExplorerUtils.createLookup(em, getActionMap()));

После этого у нас появился новый метод обновления узла. 

Теперь откройте модуль «PatientEditor». Добавьте модули Hibernate и DatabaseConnection в качестве зависимостей, чтобы мы могли получить доступ к их классам.

После этого мы добавляем в форму несколько кнопок, например:

Затем мы можем начать добавлять некоторые функции к кнопкам выше, например, для кнопки «Добавить»:

        if (DatabaseEntityManager.getEntityManager().getTransaction().isActive()) {
DatabaseEntityManager.getEntityManager().getTransaction().rollback();
DatabaseEntityManager.getEntityManager().getTransaction().begin();
} else {
DatabaseEntityManager.getEntityManager().getTransaction().begin();
}

Patient patient = new Patient(namefield.getText(), illnessfield.getText());
DatabaseEntityManager.getEntityManager().persist(patient);
DatabaseEntityManager.getEntityManager().getTransaction().commit();
JOptionPane.showMessageDialog(this, "saving successful", "Congratulation", JOptionPane.INFORMATION_MESSAGE);
PatientViewerTopComponent.findInstance().refreshNode();

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

Конечно, мы хотим, чтобы они были добавлены в наш список слева, поэтому мы должны добавить базу данных в «ChildFactory». Давайте сделаем это сейчас. Измените функцию «createKeys (List <Patient> list)», добавив туда запрос к базе данных:

        Query qa = DatabaseEntityManager.getEntityManager().createQuery("from Patient as p");
Iterator ite_a = qa.getResultList().iterator();
while (ite_a.hasNext()) {
Patient tmpPatient = new Patient("", "");
tmpPatient = (Patient) ite_a.next();
list.add(tmpPatient);
}
return true;

Это все, что нам нужно сделать! Мы заполнили заявку и можем попытаться проверить, все ли работает. Вы также можете добавить код для кнопок «Отмена» и «Обновить», если хотите.

Надеюсь, что это поможет вам начать работу с платформой NetBeans в сочетании с аннотацией Hibernate. И после того, как вы прошли через все вышесказанное, вы должны сравнить результат с руководством Константина Драбо, чтобы увидеть, какой подход вы предпочитаете!