0Pricing
Java Academy · Урок

Отображение сущностей с аннотациями JPA

Определяйте @Entity, @Table, @Id, @GeneratedValue, @Column и @Embedded для корректного проектирования сущностей.

«Отображение сущностей с аннотациями JPA» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Что такое сопоставление сущностей JPA

JPA (Jakarta Persistence API) сопоставляет классы Java с таблицами базы данных с помощью аннотаций. Hibernate — наиболее распространённый поставщик JPA. SQL DDL не требуется — JPA создаёт схемы на основе аннотаций.

@Entity и @Table

@Entity помечает класс как сущность JPA. @Table настраивает имя таблицы, схему и ограничения уникальности. У каждой сущности должен быть конструктор без аргументов (он может быть защищённым).

@Entity
@Table(name = "users", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {
    // ...
    protected User() {} // required by JPA
}

@Id и @GeneratedValue

@Id помечает поле первичного ключа. @GeneratedValue настраивает стратегию автоматической генерации: IDENTITY (автоинкремент базы данных), SEQUENCE (последовательность базы данных, лучше для массовой вставки) или AUTO.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

@Column: настройка столбцов

@Column задаёт имя столбца, его длину, допустимость значения null и уникальность. Если аннотация отсутствует, имя поля становится именем столбца.

@Column(name = "full_name", nullable = false, length = 100)
private String name;
@Column(name = "email", unique = true, nullable = false)
private String email;
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;

@Embedded и @Embeddable

Вынесите группу столбцов в повторно используемый объект-значение, помеченный аннотацией @Embeddable. Используйте @Embedded в сущности, чтобы включить его поля.

@Embeddable
public class Address {
    private String street, city, country;
    @Column(name = "zip_code") private String zipCode;
}
@Entity
public class User {
    @Embedded private Address address;
}

@Enumerated: сохранение перечислений

Сохраняйте перечисления в виде строки с их именем (STRING) или целого числа, обозначающего их порядковый номер (ORDINAL). Всегда используйте STRING — порядковые номера перестают соответствовать значениям при их перестановке.

@Enumerated(EnumType.STRING)
@Column(nullable = false)
private UserStatus status; // stored as "ACTIVE", "INACTIVE", etc.

@CreationTimestamp и @UpdateTimestamp

Специфичные для Hibernate аннотации, которые автоматически устанавливают метку времени при вставке и обновлении соответственно — вручную использовать @PrePersist не требуется.

@CreationTimestamp
@Column(updatable = false)
private LocalDateTime createdAt;
@UpdateTimestamp
private LocalDateTime updatedAt;

@Transient: исключение полей

Поля, помеченные аннотацией @Transient, не сохраняются. Используйте её для производных или вычисляемых полей, которые не следует хранить в базе данных.

@Transient
public String getFullName() { return firstName + " " + lastName; }

@Lob: большие объекты

Используйте @Lob, чтобы сопоставить большие текстовые (TEXT/CLOB) или двоичные (BLOB) столбцы. PostgreSQL сопоставляет @Lob String с типом TEXT.

@Lob
@Column(name = "content")
private String content; // maps to TEXT in PostgreSQL

Контракт equals и hashCode

Сущности JPA, используемые в коллекциях, должны реализовывать equals / hashCode на основе бизнес-ключа, а не сгенерированного ID, равного null до сохранения. Используйте @NaturalId или суррогатный ключ UUID.

@Override public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof User u)) return false;
    return email != null && email.equals(u.email);
}
@Override public int hashCode() { return getClass().hashCode(); }

@Version для оптимистической блокировки

Добавьте поле @Version. Hibernate увеличивает его при каждом обновлении. Если две транзакции одновременно обновляют одну строку, вторая выбрасывает OptimisticLockException.

@Version
private Long version; // auto-managed by Hibernate

Быстрая проверка

Почему в @Enumerated следует использовать STRING, а не ORDINAL?

Итоги

Используйте @Entity/@Table для сопоставления класса с таблицей. @Id+@GeneratedValue — для первичных ключей. @Column — для ограничений. @Embedded — для объектов-значений. Всегда используйте @Enumerated(STRING). Добавляйте @Version для оптимистической блокировки.

Часто задаваемые вопросы

Урок «Отображение сущностей с аннотациями JPA» бесплатный?

Да — полный текст урока «Отображение сущностей с аннотациями JPA» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Отображение сущностей с аннотациями JPA»?

Определяйте @Entity, @Table, @Id, @GeneratedValue, @Column и @Embedded для корректного проектирования сущностей. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Отображение сущностей с аннотациями JPA»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Отображение сущностей с аннотациями JPA
  2. Репозитории Spring Data и методы запросов
  3. Связи один-ко-многим и многие-ко-многим
  4. Пагинация, сортировка и проекции
← Назад к Java Academy