Чаще всего, когда мы имеем дело с 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).