Ответ
При написании 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, чтобы проверить корректность маппинга, каскадных операций и бизнес-логики, работающей с данными.