← Назад к вопросам

Что нужно написать в классе 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 sequenece
    • GenerationType.UUID — UUID v4
    • GenerationType.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 правильно маппировать объекты на таблицы и управлять их жизненным циклом.

Что нужно написать в классе Entity? | PrepBro