1. Анотація @Entity, @Table

Якщо ти хочеш замапити свій клас на таблицю в базі даних, для цього потрібно додати до нього цілих 3 анотації.

По-перше, потрібно додати до класу @Entity. Ця анотація перед класом вкаже Hibernate, що це не просто клас, а спеціальний клас, об'єкти якого потрібно зберігати у базі даних.

Приклад:


@Entity
class User {
    public int id;
    public String name;
    public int level;
    public Date createdDate;
}

Цього достатньо, щоб Hibernate по-особливому ставився до об'єктів цього класу.

Друга анотація — @Table. З її допомогою можна вказати ім'я таблиці в базі, з якою буде пов'язаний цей клас. Приклад:


@Entity
@Table(name="user")
class User {
    public int id;
    public String name;
    public int level;
    public Date createdDate;
}

Якщо ім'я класу та ім'я таблиці збігаються, то анотацію @Table можна не вказувати.

Також якщо твоя програма працює з таблицями з кількох схем одночасно, потрібно вказати, в якій конкретно схемі знаходиться таблиця:


@Entity
@Table(name="user", schema="test")
class User {
    public int id;
    public String name;
    public int level;
    public Date createdDate;
}

Так, все саме просто, як здається на перший погляд.

2. Анотація @Column

Другий важливий момент, який потрібно знати, — це мапінг колонок таблиці на поля класу. У найпростішому варіанті Hibernate просто сам замапить поля твого entity-класу на колонки потрібної таблиці.

Якщо ж ти хочеш контролювати всі нюанси мапінгу, то можеш скористатися анотацією @Column. Приклад:


@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;
 
  @Column(name="name")
   public String name;
 
  @Column(name="level")
   public Integer level;
 
   @Column(name="created_date")
   public Date createdDate;
}

Анотація @Column має різні параметри. Нижче ми розглянемо найпопулярніші з них:

# Ім'я атрибута Тип атрибуту Опис
1 name String Вказує ім'я колонки таблиці для поля класу
2 unique boolean Всі значення поля мають бути унікальними
3 nullable boolean Поле може набувати значення null
4 length int Максимальна довжина (для рядків)

Давай додамо кілька обмежень на поля нашого Entity-класу User:

  • ім'я користувача має бути унікальним і не довшим за 100 символів
  • level може бути null
  • createdDate не може бути null

Тоді наші анотації стануть такими:


@Entity
@Table(name="user")
class User {
   @Column(name="id")
    public Integer id;
 
   @Column(name="name", unique=true, length=100)
   public String name;
 
   @Column(name="level", nullable=true )
   public Integer level;
 
   @Column(name="created_date", nullable=false )
   public Date createdDate;
}

Ти можеш створити об'єкт типу User і навіть привласнити йому всі поля null, однак в разі спробі зберегти його до бази даних Hibernate виконає перевірку, і якщо якісь обмеження порушені, кинеться виняток.

3. Анотація @Id

І ще одна важлива анотація — це @Id. З її допомогою можна вказати первинний ключ для таблиці.

Потрібно просто поставити цю анотацію біля потрібного поля — і Hibernate сам усе зробить:


@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String name;
 
   @Column(name="level")
   public Integer level;
 
   @Column(name="created_date")
   public Date createdDate;
}

Якщо ти хочеш, щоб Hibernate самостійно генерував ID твоїх об'єктів під час їх додавання до бази, потрібно додати ще одну анотацію — @GeneratedValue. Тоді наш приклад виглядатиме так:


@Entity
@Table(name="user")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="name")
   public String name;
 
   @Column(name="level")
   public Integer level;
 
   @Column(name="created_date")
   public Date createdDate;
}

Ми тут опустили анотацію @Column для поля id, оскільки вона не несе цінної інформації — ім'я поля та ім'я колонки в таблиці збігаються, а завдяки решті анотацій Hibernate і так розуміє, що йдеться про колонку таблиці.