Что такое Panache для работы с MongoDB в Quarkus?

«Что такое Panache для работы с MongoDB в Quarkus?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Panache — это модуль фреймворка Quarkus, который значительно упрощает разработку слоя доступа к данным (Data Access Layer) для MongoDB (и других СУБД), предлагая два стиля: Active Record и Repository.

Цель: Уменьшение шаблонного кода (boilerplate) для стандартных CRUD-операций.

1. Стиль Active Record

Сущность наследуется от PanacheMongoEntity и сама содержит методы для работы с данными.

import io.quarkus.mongodb.panache.PanacheMongoEntity;

@Entity
public class Person extends PanacheMongoEntity {
    public String name;
    public Integer age;

    // Статические методы для запросов становятся доступны прямо на классе
    public static Person findByName(String name) {
        return find("name", name).firstResult();
    }

    public static List<Person> findAdults() {
        return list("age >= ?1", 18); // Поддержка HQL-подобных запросов
    }
}
// Использование
Person person = new Person();
person.name = "Alice";
person.age = 30;
person.persist(); // Сохранение
Person found = Person.findByName("Alice");

2. Стиль Repository

Создается отдельный репозиторий, реализующий PanacheMongoRepository<Entity>.

import io.quarkus.mongodb.panache.PanacheMongoRepository;
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class PersonRepository implements PanacheMongoRepository<Person> {
    // Базовые методы (findById, listAll, persist, delete и т.д.) предоставляются автоматически
    public List<Person> findAdults() {
        return list("age >= ?1", 18);
    }
}

Ключевые возможности Panache MongoDB:

  • Автоматические CRUD-операции: persist(), findById(), listAll(), delete(), update().
  • Удобные запросы: Поддержка Hibernate-подобного HQL (Panache Query) для MongoDB.
  • Интеграция с Quarkus: Работа в рамках CDI, автоматическое управление сессиями.
  • Генерация _id: Автоматическая генерация ObjectId для сущностей, наследующих PanacheMongoEntity.