Какие аннотации JPA/Hibernate вы используете при написании Entity-классов для тестовых баз данных?

«Какие аннотации JPA/Hibernate вы используете при написании Entity-классов для тестовых баз данных?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При написании Entity-классов, которые используются в интеграционных тестах с тестовой БД (например, H2 или Testcontainers), я применяю стандартный набор аннотаций JPA. Важно, чтобы модель в тестах максимально соответствовала продакшен-модели.

Базовый набор аннотаций для Entity:

import javax.persistence.*; // или jakarta.persistence.*
import java.time.LocalDate;
import java.util.List;

@Entity // 1. Объявляет класс как JPA-сущность
@Table(name = "employees") // 2. Задает имя таблицы в БД (опционально, если совпадает с именем класса)
public class Employee {

    @Id // 3. Помечает поле как первичный ключ
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 4. Стратегия генерации ID (автоинкремент)
    private Long id;

    @Column(name = "full_name", nullable = false, length = 200) // 5. Детализация колонки
    private String fullName;

    @Column(unique = true) // 6. Ограничение уникальности
    private String corporateEmail;

    @Enumerated(EnumType.STRING) // 7. Сохранение enum как строки (важно для читаемости данных в тестах)
    private Department department;

    @Temporal(TemporalType.DATE) // Для java.util.Date. С Java 8 чаще используем LocalDate без @Temporal
    private Date hireDate;

    // 8. Пример с LocalDate (предпочтительнее)
    private LocalDate birthDate;

    // 9. Связь One-to-Many
    @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Task> assignedTasks;

    // 10. Поле, не сохраняемое в БД (например, вычисляемое поле для проверки в тесте)
    @Transient
    private boolean isNewEmployee;

    // Конструкторы, геттеры, сеттеры...
}

Для тестирования также часто используются:

  • @Embeddable и @Embedded для компонентов (например, Address внутри Employee).
  • @SqlResultSetMapping и @NamedNativeQuery для тестирования сложных нативных запросов.
  • @EntityListeners для проверки аудита (например, кто и когда создал запись).

В тестах мы часто используем эти Entity вместе с Spring Data JPA репозиториями или Hibernate Session, чтобы проверить корректность маппинга, каскадных операций и бизнес-логики, работающей с данными.