2.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.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-класу

  • ім'я користувача має бути унікальним і не довшим за 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 виконає перевірку, і якщо якісь обмеження порушені, то буде виняток.

2.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 і так розуміє, що йдеться про колонку таблиці.