Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройка проекта

Для работы с 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.actiondrop-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:java
INFO: 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

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.