Skip to the content.

Технологии программирования

Главная / Конспект лекции: Spring Framework. JPA. Hibernate

Конспект лекции: Spring Framework. JPA. Hibernate

Содержание

  1. JPA (Java Persistence API)
  2. Spring JPA (Spring Data JPA)
  3. Hibernate
  4. Jooq (Java Object Oriented Querying)

JPA (Java Persistence API)

JPA (Java Persistence API) - это стандарт языка Java для управления реляционными данными в Java-приложениях. По сути, это набор правил и инструментов, которые позволяют работать с базами данных, используя объекты Java.

JPA (Java Persistence API) определен как официальный стандарт Java, который является частью платформы Java EE (Enterprise Edition). Он описан в спецификации JSR 338 (Java Specification Request).

Где определен JPA:

Аннотации:

Основные аннотации JPA используются для определения сущностей и их связей:

Интерфейсы: Основные интерфейсы для работы с данными:

// Импорт пакетов JPA
import javax.persistence.*;

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "user_name")
    private String name;
    
    // геттеры и сеттеры
}

1. Spring JPA (Spring Data JPA)

Что это? Spring Data JPA — это модуль фреймворка Spring, упрощающий интеграцию с JPA (Java Persistence API). Он предоставляет абстракцию над JPA, автоматизируя рутинные операции (CRUD) через репозитории и уменьшая объем шаблонного кода.

Особенности:

// Сущность User
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    // геттеры и сеттеры
}

// Репозиторий
public interface UserRepository extends JpaRepository<User, Long> {
    // Автоматическая реализация метода
    List<User> findByUsername(String username);

    // Кастомный запрос через JPQL
    @Query("SELECT u FROM User u WHERE u.username LIKE %:keyword%")
    List<User> searchByKeyword(@Param("keyword") String keyword);
}

// Использование в сервисе
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public List<User> findUsersByName(String name) {
        return userRepository.findByUsername(name);
    }
}

Hibernate

Что это? Hibernate — самая популярная реализация JPA, предоставляющая ORM (Object-Relational Mapping). Он преобразует объекты Java в записи БД и наоборот, управляя жизненным циклом сущностей.

Особенности:

// Сущность Product
@Entity
@Table(name = "products")
public class Product {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private Double price;
    // геттеры и сеттеры
}

// Использование Hibernate через EntityManager
@Repository
public class ProductDao {
    @PersistenceContext
    private EntityManager entityManager;

    public List<Product> findExpensiveProducts(double minPrice) {
        return entityManager.createQuery(
            "SELECT p FROM Product p WHERE p.price > :price", Product.class)
            .setParameter("price", minPrice)
            .getResultList();
    }
}

Основные преимущества:

Основные недостатки:

Для работы с Hibernate в проекте на Gradle вам потребуются следующие основные зависимости:

Вот пример конфигурации build.gradle:

dependencies {
    // Hibernate Core
    implementation 'org.hibernate:hibernate-core:5.5.7.Final'
    
    // Hibernate Entity Manager
    implementation 'org.hibernate:hibernate-entitymanager:5.5.7.Final'
    
    // Hibernate Validator (опционально)
    implementation 'org.hibernate:hibernate-validator:6.2.0.Final'
    
    // PostgreSQL JDBC драйвер
    implementation 'org.postgresql:postgresql:42.3.8'
}

Пример конфигурации в файле application.yml в каталоге src/main/resources:

# Конфигурация базы данных
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/your_database
    username: your_username
    password: your_password
    driver-class-name: org.postgresql.Driver
    
  # Hibernate настройки
  jpa:
    hibernate:
      # Диалект для PostgreSQL
      dialect: org.hibernate.dialect.PostgreSQLDialect
      # Создание и обновление схемы БД
      ddl-auto: update
      # Вывод SQL в консоль
      show-sql: true
      
    # Дополнительные настройки
    properties:
      hibernate:
        # Управление сессией
        current_session_context_class: thread
        # Оптимизация
        format_sql: true

Jooq (Java Object Oriented Querying)

Что это? Jooq — библиотека для типобезопасного SQL. Вместо ORM она генерирует Java-классы по схеме БД, позволяя писать SQL-запросы через DSL (Domain-Specific Language).

Особенности:

// Генерируемый класс Tables содержит метаданные БД
// Предположим, есть таблица "authors"
public class AuthorService {
    public void getAuthorsByCountry(Connection connection, String country) {
        DSLContext ctx = DSL.using(connection, SQLDialect.POSTGRES);
        
        // Типобезопасный запрос
        Result<Record> result = ctx.select()
            .from(Tables.AUTHORS)
            .where(Tables.AUTHORS.COUNTRY.eq(country))
            .fetch();

        for (Record r : result) {
            System.out.println(r.getValue(Tables.AUTHORS.NAME));
        }
    }
}

Вот пример конфигурации build.gradle:

plugins {
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.8.21'
    id 'org.jooq.gradle' version '5.3.2'
}

repositories {
    mavenCentral()
}

dependencies {
    // JOOQ
    implementation 'org.jooq:jooq:3.19.3'
    implementation 'org.jooq:jooq-meta:3.19.3'
    implementation 'org.jooq:jooq-codegen:3.19.3'
    
    // PostgreSQL driver
    implementation 'org.postgresql:postgresql:42.5.4'
    
    // Kotlin (если используете)
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

jooq {
    version = '3.19.3'
    edition = 'OSS'
    
    configurations {
        main {
            jdbc {
                driver = 'org.postgresql.Driver'
                url = 'jdbc:postgresql://localhost:5432/your_database'
                user = 'your_username'
                password = 'your_password'
            }
            generator {
                name = 'org.jooq.codegen.DefaultGenerator'
                database {
                    name = 'org.jooq.meta.postgres.PostgreSQLDatabase'
                    inputSchema = 'public'
                    includes = '.*'
                    excludes = ''
                }
                generate {
                    relations = true
                    deprecated = false
                    records = true
                    pojos = true
                    immutablePojos = false
                    fluentSetters = true
                }
                target {
                    packageName = 'com.example.generated'
                    directory = 'src/main/java'
                }
            }
        }
    }
}

Пример конфигурации в файле application.yml в каталоге src/main/resources:

# JOOQ Configuration
jooq:
  sql-dialect: POSTGRES
  
  # Database connection properties
  datasource:
    url: jdbc:postgresql://localhost:5432/your_database
    username: your_username
    password: your_password
    driver-class-name: org.postgresql.Driver
    
  # Configuration for generated classes
  config:
    record-pojo-impl: true
    
  # Database schema
  database:
    input-schema: public
    
# Spring configuration
spring:
  datasource:
    initialization-mode: always
    
  # Hibernate (если используется вместе с JOOQ)
  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        default_schema: public

# Logging
logging:
  level:
    org:
      jooq:
        SQL: DEBUG

Сравнение Hibernate и Jooq