Руководство по Hibernate. Соединяющие файлы.

Чаще всего, когда мы имеем дело с ORM фреймворком, связи между объектами и таблицами в базе данных (далее – БД) указываются в XML – файле.
Давайте рассмотрим наш предыдущий POJO – класс Developer.java


package net.proselyte.hibernate.pojo;

public class Developer {
    private int id;
    private String firstName;
    private String lastName;
    private String specialty;
    private int experience;

    /**
     * Default Constructor
     */
    public Developer() {
    }

    /**
     * Plain constructor
     */
    public Developer(int id, String firstName, String lastName, String specialty, int experience) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.specialty = specialty;
        this.experience = experience;
    }


    /**
     * Getters and Setters
     */
    public int getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getSpecialty() {
        return specialty;
    }

    public void setSpecialty(String specialty) {
        this.specialty = specialty;
    }

    public int getExperience() {
        return experience;
    }

    public void setExperience(int experience) {
        this.experience = experience;
    }

    /**
     * toString method (optional)
     */
    @Override
    public String toString() {
        return "Developer{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", specialty='" + specialty + '\'' +
                ", experience=" + experience +
                '}';
    }
}


Тперь создадим таблицу в БД под названием HIBERNATE_DEVELOPERS:


CREATE TABLE HIBERNATE_DEVELOPERS(
   ID INT NOT NULL AUTO_INCREMENT,
   FIRST_NAME VARCHAR(50) DEFAULT NULL,
   LAST_NAME VARCHAR(50) DEFAULT NULL,
   SPECIALTY VARCHAR(50) DEFAULT NULL,
   EXPERIENCE INT DEFAULT NULL,
   PRIMARY KEY(ID)
);

На данный момент у нас есть две независимых друг от друга сущности: POJO – класс Developer.java и таблица в БД HIBERNATE_DEVELOPERS.

Для того, чтобы связать их друг с другом и получить возможность сохранять значения полей класса, нам необходимо объяснить, как именно это делать Hibernate фреймворку.
ЧТобы это сделать, мы создаём конфигурационной XML – файл Developer.hbm.xml
Вот этот файл:


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="net.proselyte.hibernate.pojo.Developer" table="HIBERNATE_DEVELOPERS">
        <meta attribute="class-description">
            This class contains developer's details.
        </meta>
        <id name="id" type="int" column="id">
            <generator class="native"/>
        </id>
        <property name="firstName" column="first_name" type="string"/>
        <property name="lastName" column="last_name" type="string"/>
        <property name="specialty" column="last_name" type="string"/>
        <property name="experience" column="salary" type="int"/>
    </class>
</hibernate-mapping>

На данный момент мы ещё не можем сказать, что наше приложение готово, но у нас есть часть необходимых конфигураций. Давайте разберем их.

  • <hibernate-mapping>
    Это ключевой тег , который должен быть в каждом XML – фалйе для связывания (mapping). Внутри этого тега мы и конфигурируем наши связи.
  • <class>
    Тег <class> используется для того, чтоы указать связь между POJO – классов и таблицей в БД. Имя класса указывается с помощью свойства name, имя таблицы в БД – с помощью свойства table.
  • <meta>
    Опциональный (необязательный) тег, внутри которого мы можем добавить описание класса.
  • <id>
    Тег <id > связывает уникальный идентификатор ID в POJO – классе и первичный ключ (primary key) в таблице БД. Свойство name соединяет поле класса со свойством column, которое указывает нам колонку в таблице БД. Свойство type определяет тип связывания (mapping) и используется для конфертации типа данных Java в тип данных SQL.
  • <generator>
    Этот тег внутри тега <id> используется для того, что генерировать первичные ключи автоматически. Если мы указываем это свойство native, как в примере, приведённом выше, то Hibernate сам выберет алгоритм (identity, hilo, sequence) в зависимости от возможностей БД.
  • <property>
    Мы используем этот тег для того, чтобы связать (map) конкретное поле POJO – класса с конкретной колонкой в таблице БД. Свойство name указывает поле в классе, в то время как свойство column указывает на колонку в таблице БД. Свойство type указывает тип связывания (mapping) и конвертирует тип данных Java в тип данных SQL.

Существуют также и другие теги, которые могут быть использованы в конфигурационном XML – файле, которые не были указаны в этой теме. Но в течение всего цикла статей, посвящённых Hibernate, мы постараемся поговорить о большинстве из них.
А в этой статье мы ознакомились с основами применения созединящих файлов (mapping files).