Благодаря ORM можно сохранить объект в базу данных.
При сохранении какого-либо объекта в базу данных, объект будет превращен в строку таблицы базы данных.
Значения же полей этого объекта будут значениями аттрибутов этой строки таблицы. То есть поля объектаассоциированы с аттрибутами таблицы, а класс объекта ассоциирован с конкретной таблицей в БД.
То есть если, например, есть класс "Пользователь" с определенными полями – имя, фамилия, возраст и мы хотим поместить объект этого класса в БД, то там должна быть соответствующая этому классу таблица с аттрибутами имя, фамилия, возраст, в которой и будут храниться объекты класса "Пользователь".
Hibernate также помогает сократить много jdbc кода (внутри Hibernate выполняется весь jdbc код, который нам пришлось бы писать) и избавиться от low-level SQL запросов.
Также необходимо скачать файлики dom4j-2.1.3.jar и mysql-connector-j-8.0.32.jar. Их можно скачать на mavenrepository.com.
Далее создаем обычный Java проект с main. Для того чтобы демонстрировать азы Hibernate простого main проекта будет достаточно.
Чтобы создать проект для начала сменим режим нашей ide, для этого переходим Window -> Perspective -> Open Perspective -> Other -> Java.
Теперь создаем проект. Создается он по пути File -> New -> Java Project. Даем имя проекту и нажимаем Finish.
Теперь в созданном проекте создаем папку lib и закидываем в нее все файлы из папки required в архиве Hibernate Orm. Также закидываем туда другие два jar, которые были скачаны отдельно.
Теперь необходимо вручную добавить их в classpath. Для этого кликаем правой кнопкой мыши по проекту и выбираем -> properties -> Java Build Path -> Add Jars и выбираем все jar файлы в папке lib. Теперь можем писать код.
Структура проекта такая:
Как видим, в проект также были добавлены три файлика. Их разберем далее.
Работа с Hibernate
Давайте для начала sql запросом создадим простую таблицу "books" с одним аттрибутом "name". Ну и аттрибутом id само собой.
Мы создали таблицу. Теперь давайте же создадим класс Books, который будет связан с созданной таблицей. Связь происходит с помощью аннотаций. Имя этот класс может иметь любое и поля в нем тоже могут иметь любые имена. Нам главное связать класс с таблицей и поля класса с аттрибутами таблицы.
package HibernateApps;
import javax.persistence.Column;
// Класс, который будет связан с таблицей в БД
// Помечается аннотацией @Entity
@Entity
// Связываем этот класс с таблицей books
// Аннотацией @Table.
// Передаем в нее имя таблицы.
@Table(name = “books”)
public class Book {
// Свяжем поле id класса с ключевым атрибутом
// в таблице.
// Для этого для начала помечаем
// его аннотацией @Id.
@Id
// Аннотацией @GeneratedValue можем указать,
// каким образом будут генерироваться ключи
// в таблице.
// identity – значение по умолчанию.
// Означает, что мы оставляем генерацию значений
// ключей на выбор используемой стратегии.
// То есть БД будет автоматически
// инкрементировать значение ключа
// при вставке новой записи в таблицу.
// Также, например, можем создать собственную
// стратегию генерации и указать здесь,
// но мы оставим identity.
@GeneratedValue(strategy = GenerationType.IDENTITY)
// С помощью Column связываем поля
// класса с соответствующими столбцами таблицы,
// передавая в аннотацию имена этих столбцов.
@Column(name = “id”)
private int id;
@Column(name = “name”)
private String bookName;
public Book() {
}
public Book(String bookName) {
super();
this.bookName = bookName;
}
// Также обязательно создаем геттеры и сеттеры
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
// И переопределим метод toString, чтобы он
// выводил содержимое объекта класса.
// Пригодится.
@Override
public String toString() {
return “Book [id=” + id + “, bookName=” + bookName + “]”;
}
}
Теперь нам нужно настроить подключение Hibernate к maysql и базе данных.
Теперь собственно перейдем к созданию Hibernate программы. В ней мы просто создаем объект класса Books, сохраняем его в таблицу books в виде строки, потом эту же строку, которую мы туда сохранили извлекаем из таблицы в новый объект.
package HibernateApps;
import java.util.List;
public class HibernateApp {
public static void main(String[] args) {
// Объект SessionFactory анализирует конфигурационный
// файл, совершает подключение к БД, анализирует классы
// с аннотациями и создает объекты Session.
// Session объект является оберткой над ОДНИМ
// jdbc подключением к базе, то есть можно создать
// несколько сессий, а значит несколько подключений.
// Этот объект используется для взаимодействия с базой.
// Короткоживущий объект создается для каждой транзакции.
// То есть создали Сессию -> совершили действия с базой
// в пределах транзакции -> закоммитили транзакцию ->
// объект сессии умер.
// Как видим, мы передаем объекту SessionFactory имя файла
// конфигурации и имя класса с аннотациями для связи с БД.
SessionFactory sessionfactory = new Configuration()
.configure(“hibernate.cfg.xml”)
.addAnnotatedClass(Book.class)
.buildSessionFactory();
Session session = sessionfactory.getCurrentSession();
try {
// Создадим объект класса Book, который
// как мы помним, связан с таблицей books
// поэтому мы можем добавить этот объект
// в эту таблицу как строку таблицы.
Book book = new Book(“Harry Potter”);
// Выведем на консоль id. Он пока ноль
System.out.println(book.toString());
// В Hibernate мы работаем с транзакциями
// точнее с последовательностями запросов,
// которые можно откатить, поэтому начинаем
// транзакцию с помощью beginTransaction.
session.beginTransaction();
// Сохраняем объект в таблицу, связанную
// с его классом с помощью аннотаций.
session.save(book);
// Сохраняем изменения в базе с помощью commit.
session.getTransaction().commit();
// После коммита id объекта book уже будет
// не ноль. После коммита полю объекта book,
// помеченному как ключ аннотацией @Id,
// присваивается автоинкрементированное
// базой значение.
System.out.println(book.toString()); // id уже 1
// Новая сессия создается для каждой новой транзакции
session = sessionfactory.getCurrentSession();
session.beginTransaction();
// С помощью get можем извлечь объект book
// из базы в новый объект.
// Передаем в метод get имя класса объекта,
// который мы извлекаем, и ключ строки извлекаемого объекта
// в таблице.
Book harrypotterbook = session.get(Book.class, book.getId());
session.getTransaction().commit();
// Мы извлекли ранее созданный объект book
// в новый объект harrypotterbook, значит id
// у него тоже будет 1
System.out.println(harrypotterbook.toString());
} catch (Exception e) {
// Откатываем изменения в БД
// если при транзакции случилась ошибка
session.getTransaction().rollback();
e.printStackTrace();
} finally {
// По окончании работы с сессией закрываем ее
session.close();
}
}
}
Давайте запустим нашу программу. Для запуска main приложения в eclipse просто достаточно нажать зеленую кнопку в панели сверху.
Первая строка это первый вывод на консоль в программе с помощью ToString. Как уже было сказано, id у объекта пока ноль.
Далее insert запросом происходит добавление объекта в базу.
Второй вывод на консоль содержимого объекта показывает, что после вызова save над объектом, который мы сохраняли в БД, поле id этого объекта теперь имеет значение. То есть метод saveзаписал в поле id объекта book значение.
Далее происходит запрос на выборку только что добавленной строки в таблицу в новый объект.
В последнем выводе на консоль видим, что мы успешно извлекли из таблицы ее строку в новый объект содержимое, которого мы выводим.
Изучите HQL в Hibernate: объектно-ориентированный язык запросов для работы с БД через классы. Примеры запросов, сравнение с SQL и практическое применение в Java-приложениях.
Time to read: 17
HQL: обновление данных (Update)
Обновление данных в Hibernate через изменение объектов и HQL-запросы. Примеры работы с методами update и executeUpdate для модификации записей.
Time to read: 16
HQL: удаление данных (Delete)
Удаление данных в Hibernate: методы delete() и HQL-запросы. Практические примеры удаления как отдельных строк, так и групп записей из базы данных.