← Назад к вопросам
Что нужно написать в классе Entity?
1.0 Junior🔥 241 комментариев
#ORM и Hibernate#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что нужно писать в классе Entity
Entity — это класс, который отображает таблицу в базе данных. Для корректной работы с Hibernate и JPA требуется набор обязательных и рекомендуемых элементов.
Обязательные аннотации
@Entity — главная аннотация, указывающая что класс — это сущность:
@Entity
@Table(name = "users") // Название таблицы в БД
public class User {
}
@Id — обозначает первичный ключ:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.UUID) // или IDENTITY, SEQUENCE
private UUID id;
}
Полный пример Entity класса
@Entity
@Table(name = "users", indexes = @Index(name = "idx_email", columnList = "email"))
public class User {
// Первичный ключ
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;
// Обычные поля
@Column(name = "email", nullable = false, unique = true, length = 255)
private String email;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
// Связи с другими сущностями
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Post> posts = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "role_id", nullable = false)
private Role role;
// Getters/Setters
}
Ключевые элементы
1. Аннотация @Entity
Обязательна. Говорит Hibernate, что это сущность.
2. @Table(name = "...")
Указывает имя таблицы в БД. Если не указана, используется имя класса.
3. @Id и @GeneratedValue
- @Id — обозначает первичный ключ
- @GeneratedValue — указывает как генерируется id:
GenerationType.IDENTITY— автоинкремент БДGenerationType.SEQUENCE— PostgreSQL sequeneceGenerationType.UUID— UUID v4GenerationType.TABLE— отдельная таблица счётчиков
4. @Column
Конфигурирует колонку в БД:
@Column(name = "email", // Имя в БД
nullable = false, // NOT NULL
unique = true, // UNIQUE
length = 255, // VARCHAR(255)
updatable = false) // Неизменяемо после создания
5. Relationships
- @OneToMany — один ко многим
- @ManyToOne — много к одному
- @OneToOne — один к одному
- @ManyToMany — много ко многим
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("createdAt DESC")
private List<Comment> comments;
6. Конструкторы
Должны быть:
- No-arg конструктор (public или protected) — для Hibernate
- Конструкторы с параметрами — для удобства
public class User {
// No-arg конструктор - ОБЯЗАТЕЛЕН
public User() {}
// Конструктор для создания
public User(String email, String username) {
this.email = email;
this.username = username;
}
}
7. equals() и hashCode()
Рекомендуется реализовать для правильной работы в коллекциях:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
Хорошие практики
- Используй
LocalDateTimeилиInstantвместоjava.util.Date - Делай поля
privateс getters/setters - Не создавай бизнес-логику в Entity — только данные
- Используй
new ArrayList<>()для коллекций вместо null - Для datetime используй
DateTime(timezone=True)в PostgreSQL - Всегда указывай
@Column(nullable = false)если поле обязательно
Всё вместе позволяет Hibernate правильно маппировать объекты на таблицы и управлять их жизненным циклом.