Настройка проекта
Для работы с Hibernate нужны три вещи: сама библиотека Hibernate, JDBC-драйвер вашей базы данных и настройка, которая говорит, где эта база находится. В этом уроке создадим Maven-проект и проверим, что Hibernate подключается к базе.
Создание проекта
Проект создаётся стандартным архетипом Maven:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 \
-DgroupId=com.example -DartifactId=blog -Dpackage=com.example.blog \
-DinteractiveMode=false
cd blogПоявится папка blog с файлом pom.xml и пакетом src/main/java/com/example/blog. Созданные App.java и тест можно удалить.
pom.xml
Замените содержимое pom.xml таким:
<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>blog</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>25</maven.compiler.release>
<exec.mainClass>com.example.blog.Main</exec.mainClass>
</properties>
<dependencies>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>7.4.12.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.5.252</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.6.4</version>
</plugin>
</plugins>
</build>
</project>hibernate-core подключает Hibernate вместе с API Jakarta Persistence. h2 — база данных, написанная на Java, которая умеет жить в памяти: сервер устанавливать не нужно. Плагин exec-maven-plugin запускает класс командой mvn exec:java; какой именно — задаёт свойство exec.mainClass.
persistence.xml
Подключение описывается в единице персистентности (persistence unit) — именованном наборе настроек. Создайте файл src/main/resources/META-INF/persistence.xml:
<!-- src/main/resources/META-INF/persistence.xml -->
<persistence xmlns="https://jakarta.ee/xml/ns/persistence" version="3.2">
<persistence-unit name="blog">
<properties>
<property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:blog"/>
<property name="jakarta.persistence.jdbc.user" value="sa"/>
<property name="jakarta.persistence.jdbc.password" value=""/>
<property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>| Свойство | Значение |
|---|---|
jakarta.persistence.jdbc.url | Адрес базы. jdbc:h2:mem:blog — база в памяти, она исчезает после завершения программы |
jakarta.persistence.jdbc.user, password | Логин и пароль |
...schema-generation.database.action | drop-and-create: при каждом запуске создавать таблицы по классам-сущностям |
hibernate.show_sql | Печатать каждый SQL-запрос в консоль |
Первый запуск
// src/main/java/com/example/blog/Main.java
package com.example.blog;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class Main {
public static void main(String[] args) {
try (EntityManagerFactory emf = Persistence.createEntityManagerFactory("blog")) {
Object version = emf.callInTransaction(em ->
em.createNativeQuery("select h2version()").getSingleResult());
IO.println("Подключились к H2 " + version);
}
}
}Persistence.createEntityManagerFactory("blog") читает единицу с этим именем и запускает Hibernate. Запустите:
mvn compile exec:javaINFO: HHH000001: Hibernate ORM core version 7.4.12.Final
WARN: HHH10001002: Using built-in connection pool (not intended for production use)
... (остальной лог сокращён)
Hibernate: select h2version()
Подключились к H2 2.5.252Предупреждение о встроенном пуле соединений для учёбы не страшно; в рабочих приложениях используют пул, например HikariCP.
Настройка в коде
Начиная с Jakarta Persistence 3.2 те же настройки можно записать на Java, без XML-файла:
// src/main/java/com/example/blog/Main.java
SessionFactory factory = new HibernatePersistenceConfiguration("blog")
.jdbcUrl("jdbc:h2:mem:blog")
.jdbcCredentials("sa", "")
.schemaToolingAction(Action.CREATE_DROP)
.showSql(true, false, false)
.createEntityManagerFactory();Классы импортируются из org.hibernate.jpa и org.hibernate.tool.schema. Результат тот же: Подключились к H2 2.5.252. В курсе используется persistence.xml, потому что так настроено большинство существующих проектов.
Частая ошибка
Имя в коде должно в точности совпадать с атрибутом name в persistence.xml, а сам файл — лежать в src/main/resources/META-INF. Иначе Hibernate не найдёт единицу:
Exception in thread "main" jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named blogs