Ответ
JPA — это стандартная спецификация для ORM (Object-Relational Mapping) в Java. Опыт включает реализацию слоя доступа к данным с использованием JPA-провайдеров, таких как Hibernate, EclipseLink.
Ключевые аспекты работы:
- Маппинг сущностей: Аннотирование POJO-классов (
@Entity,@Table,@Id,@GeneratedValue,@Column). - Связи между сущностями: Настройка
@OneToMany,@ManyToOne,@OneToOne,@ManyToManyс параметрамиfetch,cascade,mappedBy. - Работа с
EntityManager: Управление жизненным циклом сущностей (persist, merge, remove, find, flush). - Язык запросов: Написание и оптимизация JPQL (Java Persistence Query Language) запросов.
- Интеграция со Spring: Использование
Spring Data JPA(JpaRepository), управление транзакциями через@Transactional.
Пример сущности и репозитория:
// Сущность
@Entity
@Table(name = "projects")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "project", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Task> tasks;
// Геттеры, сеттеры, конструкторы...
}
// Репозиторий с Spring Data JPA
public interface ProjectRepository extends JpaRepository<Project, Long> {
// Декларативный запрос
List<Project> findByNameContainingIgnoreCase(String name);
// Запрос с @Query
@Query("SELECT p FROM Project p WHERE SIZE(p.tasks) > :minTasks")
List<Project> findProjectsWithMoreThanTasks(@Param("minTasks") int minTasks);
}
С какими сложностями работал:
- N+1 проблема: Решал через
JOIN FETCHв JPQL или@EntityGraph. - Управление версиями: Использовал
@Versionдля оптимистичной блокировки. - Производительность: Анализ и настройка ленивой/жадной загрузки, кэширование 2-го уровня.