Отображение сущностей с аннотациями 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 — локальная установка не требуется.
Все уроки этого курса
- Отображение сущностей с аннотациями JPA
- Репозитории Spring Data и методы запросов
- Связи один-ко-многим и многие-ко-многим
- Пагинация, сортировка и проекции