първичен ключ

На разположение

Анотация @Id

Всеки обект Entity в Hibernate трябва да има поле, което ще бъде първичен ключ: то съдържа уникална стойност за всички обекти от този клас. Обикновено това поле е анотирано с анотацията @Id .

Обща форма:

@Id
Class Name;

Пример:

@Entity
@Table(name="user")
class User
{
   @Id
   @Column(name="id")
   public Integer id;

   @Embedded
   public UserAddress address;

   @Column(name="created_date")
   public Date createdDate;
}

Поставяне на анотация

Между другото, можете да пишете @Column анотации не само за полета, но и за методи: за гетери or сетери. Пример:

@Entity
@Table(name="user")
class User
{
    public Integer id;
    public Date createdDate;

   @Id
   @Column(name="id")
   public Integer getId() {
   	return this.id;
   }
   public void setId(Integer id)    {
  	this.id = id;
   }

   @Column(name="created_date")
   public Date getDate() {
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
      this. createdDate = date;
   }
}

Този подход се появи, когато анотациите започнаха да се добавят не само към класовете, но и към интерфейсите. Интерфейсът няма класови полета, но има методи: гетери и сетери. Hibernate поддържа и двата стандарта.

важно! Ако даден клас има анотацията @Entity , тогава всички негови полета се третират от Hibernate като постоянни полета (освен ако нямат указаната анотация @Transient ). Дори ако полетата изобщо нямат анотации: в този случай името на колоната се счита за равно на името на полето на класа.

Тук анотацията @Id играе важна роля. Ако анотацията е поставена в поле на клас, тогава Hibernate ще разгледа имената и типовете на полетата. Ако анотацията @Id е поставена върху метод, тогава Hibernate ще разгледа имената и типовете на методите.

Пример 1:

@Entity
@Table(name="user")
class User
{
   @Id
    public Integer id;
    public Date createdDate;  //this field will be treated as if it had @Column(name=" createdDate ")

}

Пример 2:

@Entity
@Table(name="user")
class User
{
    public Integer id;
    public Date createdDate;

   @Id
   public Integer getId() {
   	return this.id;
   }
   public void setId(Integer id)    {
  	this.id = id;
   }

   public Date getDate() { //this field will be treated as if it had @Column(name=”date ”)
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
  	this. createdDate = date;
   }

}

@GeneratedValue анотация

Можете сами да зададете идентификатор на новите си обекти or да го оставите на милостта на Hibernate. За да може Hibernate да разбере по-добре How да присвоите идентификатори на вашите обекти, той има специална анотация:

@GeneratedValue

Тази анотация обикновено маркира същото поле като анотацията @Id . Тя има 4 възможни стратегии за присвояване на ID:

  • АВТОМАТИЧЕН
  • ИДЕНТИЧНОСТ
  • ПОСЛЕДОВАТЕЛНОСТ
  • ТАБЛИЦА

Пример за анотация с посочената стратегия:

@Entity
@Table(name="user")
class User
{
    @Id
	@GeneratedValue(strategy = GenerationType.AUTO)
    public Integer id;

    public Date createdDate;
}

Ако не е посочена стойност на правилата, ще бъде избрана стратегията AUTO. Стратегията AUTO означава, че Hibernate ще присвои самия идентификатор, базиран предимно на типа данни на полето ID.

Защо на тип? Да, защото типовете ID могат да бъдат много различни, например String or GUID. Пример:

@Entity
@Table(name="user")
class User
{
    @Id
	@GeneratedValue
    public UUID id;

    public Date createdDate;
}

Забележка: GUID в Java се нарича UUID, исторически погледнато. И Hibernate може да генерира уникални UUID за вашите обекти, ако го поискате.

Различни @GeneratedValue стратегии

Ако посочите типа GeneratedValue(strategy = GenerationType.IDENTITY) , тогава Hibernate делегира настройката за ID към слоя база данни. Обикновено това използва колона с надпис PRIMARY KEY, AUTOINCREMENT.

Но ако искате вашите идентификатори да бъдат уникални и генерирани според специално определен алгоритъм, тогава можете да използвате анотацията GeneratedValue(strategy = GenerationType.SEQUENCE) , например:

@Entity
@Table(name="user")
public class User {
	@Id
	@GeneratedValue(generator = "sequence-generator")
	@GenericGenerator(
  	name = "sequence-generator",
  	strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
  	parameters = {
    	@Parameter(name = "sequence_name", value = "user_sequence"),
    	@Parameter(name = "initial_value", value = "4"),
    	@Parameter(name = "increment_size", value = "1")
    	}
	)
	private long userId;

	// ...
}

Има много повече начини за генериране на ID. Например, може да имате съставен уникален ключ, състоящ се от няколко колони. И когато записвате обект в базата данни, трябва да попълните всички тези колони.

Няма да ги давам в подробности. Все пак целта на нашите лекции е да се запознаем с Hibernate, а не да преразказваме официалната documentация.

Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари