2.1 Анотация @Entity, @Table

Ако искате да картографирате вашия клас към table в базата данни, тогава за това трябва да добавите най-много 3 анотации към него.

Първо, трябва да добавите анотация към класа @Entity. Тази анотация пред класа ще каже на Hibernate, че това не е просто клас, а специален клас, чиито обекти трябва да се съхраняват в базата данни.

Пример:

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

Това е достатъчно, за да може Hibernate да третира обектите от този клас по специален начин.

Втората анотация е @Table. С негова помощ можете да зададете името на tableта в базата данни, с която този клас ще бъде свързан. Пример:

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

Ако името на класа и името на tableта са еднакви, тогава анотацията @Tableможе да бъде пропусната.

Освен това, ако вашето приложение работи с таблици от няколко схеми едновременно, тогава трябва да посочите в коя конкретна схема се намира tableта:

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

Да, всичко е толкова просто, колкото изглежда.

2.2 @Колонна анотация

Второто важно нещо, което трябва да знаете, е картографирането на колоните на tableта към полетата на класа. В най-простата version Hibernate просто ще картографира полетата на вашия клас обект към колоните на желаната table.

Ако искате да контролирате всички нюанси на картографирането, можете да използвате анотацията @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 име низ Задава името на колоната на tableта за полето клас
2 единствен по рода си булево Всички стойности на полето трябва да са уникални
3 nullable булево Полето може да бъде нула
4 дължина вътр Максимална дължина (за низове)

Нека добавим някои ограничения към полетата на нашия клас User Entity:

  • потребителското име трябва да е уникално и не по-дълго от 100 знака
  • ниво може да бъде нула
  • createdDate не може да бъде нула

Тогава нашите анотации стават:

@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;
}

Можете да създадете обект от тип Потребител и дори да му присвоите всички нулеви полета , но когато се опитате да го запазите в базата данни, Hibernate ще извърши проверка и ако няHowви ограничения са нарушени, ще бъде хвърлено изключение.

2.3 Анотация @Id

И още една важна анотация е @Id. Може да се използва за задаване на първичен ключ за table.

Просто трябва да посочите тази анотация за желаното поле - и 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 да генерира независимо идентификаторите на вашите обекти, когато ги добавяте към базата данни, тогава трябва да добавите още една анотация - @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 тук, тъй като тя не носи ценна информация - името на полето и името на колоната в tableта са еднакви и благодарение на останалите анотации Hibernate вече разбира, че говорим за table колона.