junior
Какие основные аннотации JPA для маппинга сущностей вы знаете?
JPA использует аннотации для маппинга Java-классов на таблицы БД. Минимальный набор: @Entity, @Id, @GeneratedValue.
Пример сущности со всеми основными аннотациями
@Entity
@Table(name = "users", schema = "public",
uniqueConstraints = @UniqueConstraint(columnNames = {"email"}))
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", nullable = false, length = 100)
private String firstName;
@Column(unique = true, nullable = false)
private String email;
@Column(precision = 19, scale = 2)
private BigDecimal balance;
@Enumerated(EnumType.STRING) // всегда STRING, не ORDINAL!
@Column(nullable = false)
private UserStatus status;
private LocalDateTime updatedAt; // @Temporal не нужна для Java 8+ Date API
@Lob // для больших объектов (TEXT, BLOB)
private String description;
@Transient // НЕ маппится на колонку
private String temporaryField;
@Embedded
private Address address;
protected User() { } // конструктор без аргументов обязателен для JPA
}
Стратегии генерации ID
| Strategy | Описание |
|---|---|
| IDENTITY | Автоинкремент БД (PostgreSQL SERIAL, MySQL AUTO_INCREMENT) |
| SEQUENCE | Последовательность БД (рекомендуется для PostgreSQL) |
| TABLE | Специальная таблица для генерации ID (медленно) |
| AUTO | Провайдер выбирает стратегию сам |
Пример
// Рекомендуемый вариант для PostgreSQL
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "users_id_seq", allocationSize = 50)
private Long id;
Частые ошибки
@Enumerated(EnumType.ORDINAL)(по умолчанию) – при добавлении нового значения в enum порядок нарушится. Всегда используйтеEnumType.STRING- Забыть конструктор без аргументов – JPA не сможет создать экземпляр
GenerationType.AUTOс Hibernate может создать таблицуhibernate_sequenceвместо нативной последовательности
На собеседовании: ключевые аннотации –
@Entity,@Id,@GeneratedValue,@Column,@Enumerated(STRING). Частая ошибка – использовать EnumType.ORDINAL.