Пример Hibernate

Рассмотрим разработку Hibernate примера в среде Eclipse. Основная цель, которую будем преследовать в данном Hibernate примере - показать технологию использования библиотеки по записи объектов в таблицу БД, чтению объектов таблицы, поиску объекта по идентификатору записи ID.

На следующем скриншоте представлена структура проекта HibernateExample в среде разработки IDE Eclipse.

Hibernate пример включает :

  • класс тестирования PersonTest.java;
  • объект/класс Person.java;
  • файл описания (mapping) класса person.hbm.xml
  • файл конфигурации hibernate.cfg.xml, включающий описание подключения к серверу БД;
  • библиотеки директории lib.

В качестве СУБД в примере будем использовать MySQL. В БД создадим таблицу "test.person" в схеме "test". Конечно, таблицу можно было бы также создать с использованием Hibernate, но в данном примере мы это не будем рассматривать.

Исходный код примера можно скачать здесь.

Описание таблицы базы данных

CREATE TABLE test.person (
  id     INT (11) NOT NULL,
  name   VARCHAR (128) NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;

Тестовая таблица "person" будет включать два поля : идентификатор записи "id" и имя "name". Записи в таблице будут храниться в кодировке "UTF8".

Исходный код объекта/класса

Создадим класс Person с полями id - идентификатор записи и name - имя. Класс, с которым работает Hibernate, называется сущностью Entity. Для того, чтобы класс Person стал сущностью, добавим аннотацию @Entity. Сущности типа Person будут храниться в таблице, имя которой совпадает с именем класса, т.е. "person". Значения полей сущностей будут храниться в одноименных колонках этой же таблицы. Сущность должна иметь "persistence identity", или идентификатор. Это - ключ, который однозначно её идентифицирует и выделяет среди других сущностей такого же типа. Идентификатор указывается с помощью аннотации @Id. В классе "Person" в качестве идентификатора можно использовать поле id, которое соответствует колонке первичного ключа в таблице "test.person".

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Person 
{
    @Id
    int    id;
    String name;

    public Person() {}

    public Person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public String toString() {
        return "Person {id = " + String.valueOf(id) + ", name = '" + name + "'}";
    }
}

Конфигурационный файл объекта

XML-файл person.hbm.xml определяет "package" расположения объекта, "class" объекта и в теге <table> таблицу БД, в которой хранятся (отображаются) Person-объекты. Также в файле определяются связи полей Person-объекта со столбцами таблицы.

<?xml version='1.0'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="net.common.model">

    <class name="Person" table="person">
        <id name="id" type="int" column="id" >
            <generator class="assigned" />
        </id>

        <property name="name" >
            <column name="Name" />
        </property>
    </class>

</hibernate-mapping>

Конфигурационный файл hibernate.cfg.xml

Конфигурационный XML-файл hibernate.cfg.xml определяет параметры СУБД, учетную запись (login, password) подключения к серверу БД, а также дополнительные параметры, которые используются при работе с сервером.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">password</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="hibernate.connection.pool_size">1</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.connection.CharSet">utf8</property>
        <property name="hibernate.connection.characterEncoding">utf8</property>
        <property name="hibernate.connection.useUnicode">true</property>

        <mapping class="net.common.model.Person" />

    </session-factory>
</hibernate-configuration>

В файле конфигурации hibernate.cfg.xml определена база данных MySQL, пул подключений - 1 соединение. В свойстве "show_sql" устанавливаем истиное значение, чтобы в консоли были отображены генерируемые библиотекой Hibernate SQL-скрипты. Дополнительно устанавливаем кодировку записей UTF8, чтобы можно было бы работать с кириллицей.

Тестирование Hibernate примера

Создадим класс "PersonTest" для проверки работы библиотеки. В методе main() вызывается конструктор класса, в котором вызывается метод createHibernateSession() для создания сессии Session. Если сессия создана успешно, то в методе recordsAdd() в таблицу БД добавляются два объекта. После чего в методе recordsRead() объекты из БД "загружаются" в коллекцию и отображаются в консоли. В заключении программа вызывает метод recordFind(final int id) для поиска в таблице БД объекта по идентификатору записи и завершает работу - закрывает сессию.

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import net.common.model.Person;

public class PersonTest
{
    private       Session    session = null;
    private final String[][] persons = {{"12", "Вильям"}, {"14", "Шекспир"}};
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура создания сессии
     * @return org.hibernate.Session
     */
    private Session createHibernateSession()
    {
        SessionFactory   sessionFactory  = null;
        ServiceRegistry  serviceRegistry = null;
        try {
            try {
                Configuration cfg = new Configuration().
                                        addResource("person.hbm.xml").configure();
                serviceRegistry = new StandardServiceRegistryBuilder().
                                      applySettings(cfg.getProperties()).build();
                sessionFactory = cfg.buildSessionFactory(serviceRegistry);
            } catch (Throwable e) {
                System.err.println("Failed to create sessionFactory object." + e);
                throw new ExceptionInInitializerError(e);
            }
            session = sessionFactory.openSession();
            System.out.println("Создание сессии");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return session;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура добавления записей в таблицу
     */
    private void recordsAdd()
    {
        try {
            System.out.println("Добавление записи в таблицу БД");
            Transaction tx = session.beginTransaction();
            for (int i = 0; i < persons.length; i++) {
                Person person = new Person();
                person.setId(Integer.valueOf(persons[i][0]));
                person.setName(persons[i][1]);
                session.save(person);
            }
            tx.commit();
            System.out.println("\tЗаписи добавлены");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура чтения записей
     */
    private void recordsRead()
    {
        System.out.println("\nЧтение записей таблицы");
        String query = "select p from " + Person.class.getSimpleName() + " p";
            
        @SuppressWarnings("unchecked")
        List<Person> list = (List<Person>)session.createQuery(query).list();
        System.out.println(list);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Процедура поиска записи
     */
    private void recordFind(final int id)
    {
        System.out.println("\nЧтение записи таблицы по ID");
        Person person = (Person) session.load(Person.class, id);
        System.out.println(person);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Конструктор класса
     */
    public PersonTest()
    {
        // Создание сессии
        session = createHibernateSession();
        if (session != null) {
            // Добавление записей в таблицу
            recordsAdd();
            // Чтение записей таблицы
            recordsRead();
            // Поиск записи по идентификатору 
            recordFind(Integer.valueOf(persons[1][0]));
            // Закрытие сессии
            if (session.isOpen())
                session.close();
        }
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public static void main(String[] args)
    {
        new PersonTest();
        System.exit(0);
    }
}

Для того, чтобы действия над сущностями сохранялись в базе данных, методы для создания, изменения и удаления сущностей должны вызываться в транзакциях. Для открытия и закрытия транзакций используются методы beginTransaction() и commit() объекта Transaction

Следует обратить внимание на то, как объект сохраняется в таблице БД, как читается список объектов и как выполняется поиск объекта по идентификатору.

// сохранение объекта в таблице : recordsAdd()
session.save(person);

// чтение списка объектов : recordsRead
List<Person> list = (List<Person>)session.createQuery(query).list();

// чтение объекта по идентификатору : recordFind
Person person = (Person) session.load(Person.class, id);

В консоли будут отражены следующие результаты работы приложения :

Создание сессии
Добавление записи в таблицу БД
Hibernate: insert into person (Name, id) values (?, ?)
Hibernate: insert into person (Name, id) values (?, ?)
Записи добавлены

Чтение записей таблицы
Hibernate: select person0_.id as id1_0_, person0_.Name as Name2_0_ from person person0_
[Person {id = 12, name = 'Вильям'}, Person {id = 14, name = 'Шекспир'}]

Чтение записи таблицы по ID
Person {id = 14, name = 'Шекспир'}

Автоматически генерируемые библиотекой SQL-скрипты отображены в консоли после ключевого слова "Hibernate". Чтобы блокировать "вывод" SQL-скриптов необходимо свойству "show_sql" в файле конфигурации присвоить значение false.

  Рейтинг@Mail.ru