Что такое Entity в контексте JPA/Hibernate?

Ответ

Entity (Сущность) в JPA (Java Persistence API) — это легковесный Java-объект (POJO), состояние которого постоянно хранится в таблице реляционной базы данных. Класс помечается аннотацией @Entity.

Ключевые требования и аннотации:

  1. @Entity: Обязательная аннотация для класса.
  2. @Id: Обозначает поле, являющееся первичным ключом.
  3. @GeneratedValue: Задает стратегию генерации значений для первичного ключа (например, автоинкремент).
  4. @Table: Опционально, задает имя таблицы. По умолчанию используется имя класса.
  5. @Column: Опционально, задает имя столбца и другие атрибуты.

Пример Entity:

@Entity
@Table(name = "users") // Соответствует таблице "users" в БД
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // Автоинкремент
    private Long id;

    @Column(name = "user_name", nullable = false, length = 100)
    private String username;

    // Обязательный конструктор по умолчанию (JPA requirement)
    public User() {}

    // Геттеры и сеттеры для всех полей
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    // ... остальные геттеры/сеттеры
}

Важные особенности:

  • Должен иметь конструктор без аргументов (может быть protected).
  • Поля обычно имеют private доступ и управляются через геттеры/сеттеры.
  • Может содержать связи с другими Entity (аннотации @OneToMany, @ManyToOne и т.д.).
  • Entity представляет собой модель данных для работы с БД, в отличие от DTO, который используется для передачи данных.

Ответ 18+ 🔞

Давай разберём эту сухую теорию, как нормальные люди, а не как роботы с гвоздём в жопе.

Вот смотри, Entity в JPA — это, по сути, твой зеркальный двойник для таблицы в базе данных, только в виде Java-класса. Представь, что у тебя есть таблица users. Так вот, Entity-класс User — это её точная копия, но в коде. JPA смотрит на этот класс и понимает: «Ага, чувак, значит, тут у нас табличка users, в ней столбец id, который сам растёт, и столбец user_name, куда нельзя писать хуйню (null)».

Без чего твоя Entity — просто кусок говна, а не волшебный объект:

  1. @Entity — это как клеймо на лбу: «Я — сущность, работай со мной, блядь». Без этой аннотации JPA пройдёт мимо, как будто тебя не существует.
  2. @Id — это твой главный паспорт, первичный ключ. Без него JPA просто охуеет и спросит: «И как я, сука, отличать одну запись от другой? По цвету глаз?».
  3. @GeneratedValue — чтобы не париться и не придумывать эти id самому. Сказал GenerationType.IDENTITY — и база сама их выдаёт, как горячие пирожки.
  4. Конструктор без аргументов — это священное требование JPA. Даже если он тебе не нужен. Сделай его public или protected и забудь. Иначе в один прекрасный день всё упадёт с дикой ошибкой, и ты будешь чесать репу, как полный мудак.

Вот живой пример, как это выглядит в коде:

@Entity // Без этого — нихуя не работает!
@Table(name = "users") // Говорим: "Ищи нас, сволочь, в таблице 'users', а не 'User'"
public class User {
    @Id // Главный идентификатор, чтоб его!
    @GeneratedValue(strategy = GenerationType.IDENTITY) // Автоинкремент, чтобы не ебаться
    private Long id;

    @Column(name = "user_name", nullable = false, length = 100) // Не null и не длиннее 100 символов, а то получишь по шапке
    private String username;

    // Вот этот самый обязательный конструктор, про который все забывают!
    public User() {}

    // Далее идёт стандартная писанина — геттеры и сеттеры.
    // JPA любит, когда поля private, а доступ через эти методы.
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
}

Важный момент, чтобы не облажаться: Entity — это модель для работы с базой. Это не DTO, не ViewObject и не что-то ещё. Это прямое отражение таблицы. Если ты начнёшь сюда же пихать логику представления или ещё какую хуйню — получишь кашу, в которой потом сам запутаешься, как мартышка в стекловате.

Короче, Entity — это твой проводник в мир базы данных. Сделал его правильно — живёшь спокойно и сохраняешь данные одной строчкой кода. Накосячил — будешь, как Герасим, молча страдать и топить свои ошибки в реке отладки.