В этом руководстве я хочу показать вам, как использовать 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. И после того, как вы прошли через все вышесказанное, вы должны сравнить результат с руководством Константина Драбо, чтобы увидеть, какой подход вы предпочитаете!