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

Какими свойствами должен обладать класс, чтобы сделать из него таблицу

2.0 Middle🔥 181 комментариев
#ORM и Hibernate

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Свойства класса для преобразования в таблицу БД

Чтобы класс Java стал ORM-сущностью (Entity) и был отображён на таблицу в базе данных, он должен обладать несколькими критическими свойствами. Это применимо как для JPA/Hibernate, так и для других ORM-фреймворков.

Обязательные свойства

1. Аннотация @Entity Класс должен быть помечен аннотацией @Entity, которая указывает ORM-фреймворку, что это сущность для отображения на таблицу:

@Entity
@Table(name = "users")
public class User {
    // ...
}

2. Наличие первичного ключа (@Id) Каждая сущность должна иметь поле, аннотированное @Id, которое будет отображаться на PRIMARY KEY таблицы. Это гарантирует уникальность записи в БД:

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

3. Конструктор без параметров ОRM требует пустого конструктора (может быть protected или private) для создания экземпляров при загрузке данных из БД через рефлексию:

@Entity
public class User {
    private UUID id;
    
    // Обязателен для ORM
    protected User() {}
    
    public User(String name) {
        this.name = name;
    }
}

4. Поля должны быть сохраняемыми Все поля, которые должны быть отображены на колонки таблицы, должны быть non-static и non-transient:

@Entity
public class User {
    @Id
    private UUID id;
    
    private String name;        // Будет колонкой
    private String email;       // Будет колонкой
    
    private static final long serialVersionUID = 1L;  // НЕ будет колонкой
    transient String temp;       // НЕ будет колонкой
}

Рекомендуемые свойства

5. Правильное именование полей ОРМ по умолчанию использует имена полей для создания имён колонок. Для явного контроля используется @Column:

@Entity
public class User {
    @Column(name = "full_name")
    private String name;
    
    @Column(name = "email_address", nullable = false, unique = true)
    private String email;
}

6. Сериализуемость Хотя не обязательно для всех ORM, рекомендуется реализовать Serializable для совместимости с кешированием и сессиями:

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    // ...
}

7. Геттеры и сеттеры Для работы с ORM и инструментами типа Jackson, необходимы public методы доступа:

@Entity
public class User {
    private String email;
    
    public String getEmail() {
        return email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
}

Полный пример Entity класса

import jakarta.persistence.*;
import java.io.Serializable;
import java.util.UUID;

@Entity
@Table(name = "users", indexes = {
    @Index(name = "idx_email", columnList = "email")
})
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    private UUID id;
    
    @Column(name = "full_name", nullable = false, length = 255)
    private String name;
    
    @Column(name = "email", nullable = false, unique = true)
    private String email;
    
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;
    
    // Пустой конструктор (требуется для ORM)
    protected User() {}
    
    public User(String name, String email) {
        this.name = name;
        this.email = email;
        this.createdAt = LocalDateTime.now();
    }
    
    public UUID getId() { return id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

Заключение

Таким образом, минимальный набор свойств включает:

  • ✅ Аннотацию @Entity
  • ✅ Первичный ключ (@Id)
  • ✅ Пустой конструктор
  • ✅ Non-static, non-transient поля

Остальные аннотации (@Table, @Column, @GeneratedValue) — это best practices для более гибкого контроля над отображением на таблицу и поведением ORM-фреймворка.