Birinchi kalit

All lectures for UZ purposes
Daraja, Dars
Mavjud

@Id annotatsiyasi

Har bir Hibernate'dagi Entity obyektida, albatta, bir maydon bo'lishi kerak, bu birinchi kalit sifatida xizmat qiladi: bu sinfdagi barcha obyektlar uchun noyob qiymat saqlaydi. Odatda bu maydon @Id annotatsiyasi bilan belgilangan bo'ladi.

Umumiy ko'rinish:


   @Id
   Klass ism;

Misol:


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

Annotatsiyalarni joylashtirish

Darvoqe, sen annotatsiyalarni @Column nafaqat maydonlarda, balki metodlarda ham yozishing mumkin: getter yoki setter'larda. Misol:


@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 getCreatedDate() {
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
      this.createdDate = date;
   }
}

Shunday yondashuv paydo bo'lgan, chunki annotatsiyalarni nafaqat klasslarda, balki interfeyslarida ham qo'sha boshlashgan. Interfeysning klass maydonlari yo'q, lekin metodlari bor: getter va setter'lar. Hibernate ikkala standartni ham qo'llab-quvvatlaydi.

Mu-him! Agar klassda @Entity annotatsiyasi bo'lsa, unda uning barcha maydonlari Hibernate tomonidan saqlanadigan maydonlar sifatida ko'rib chiqiladi (agar ularda @Transient annotatsiyasi ko'rsatilmagan bo'lsa). Hatto maydonlarda umuman hech qanday annotatsiyalar bo‘lmasa ham: bunda kolonka nomi klass maydoni nomiga tenglashtiriladi.

Bu yerda @Id annotatsiyasi muhim rol o'ynaydi. Agar annotatsiya klass maydonida joylashtirilgan bo'lsa, Hibernate maydonlarning ismlari va turlariga qaraydi. Agar @Id annotatsiyasi metodda joylashtirilgan bo'lsa, Hibernate metodlarning ismlari va turlariga qaraydi.

Misol 1:


@Entity
@Table(name="user")
class User
{
   @Id
    public Integer id;
    public Date createdDate;  //bu maydon bu yerda @Column(name="createdDate") bor kabi ishlanadi
 
}

Misol 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 getCreatedDate() { //bu maydon bu yerda @Column(name="createdDate") bor kabi ishlanadi
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
  	this.createdDate = date;
   }
 
}

@GeneratedValue annotatsiyasi

Sen yangilangan obyektlaringga id'larni mustaqil ravishda berishing mumkin, yoki bu ishni Hibernate'ga topshirishing mumkin. Hibernate sening obyektlaring id'larini qanday berish kerakligini yaxshiroq tushunishi uchun u maxsus annotatsiyaga ega:


@GeneratedValue

Bu annotatsiya odatda @Id annotatsiyasi bilan belgilangan maydonga belgilanadi. Uning ID berishning 4ta ehtimoliy strategiyasi bor:

  • AUTO
  • IDENTITY
  • SEQUENCE
  • TABLE

Strategiyani ko'rsatgan annotatsiya misoli:


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

Agar strategiya qiymati ko'rsatilmagan bo'lsa, AUTO strategiyasi tanlanadi. AUTO strategiyasi Hibernate ID'ni o'zini tayinlashini bildiradi, asosan ID maydonining data tipusiga asoslanib.

Nega aynan turiga? Chunki ID turlari juda xilma-xil bo'lishi mumkin, masalan, String yoki GUID. Misol:


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

Izoh: GUID Java'da UUID deb nomlanadi, tarixan shunday bo'lgan. Va Hibernate agar sen unga murojaat qilsang, sening obyektlaring uchun noyob UUIDlarni generatsiya qilishni biladi.

@GeneratedValue uchun turli strategiyalar

Agar sen GeneratedValue(strategy = GenerationType.IDENTITY) turini ko'rsatsang, Hibernate ID o'rnini ma'lumotlar bazasi darajasiga topshiradi. Odatda, bunda PRIMARY KEY, AUTOINCREMENT sifatida belgilanadigan kolonka ishlatiladi.

Agar sen ID'laring noyob va maxsus belgilangan algoritm bo'yicha generatsiya qilinishini istasang, unda GeneratedValue(strategy = GenerationType.SEQUENCE) annotatsiyasidan foydalanishing mumkin, misol:


@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 generatsiyasining boshqa ko'plab usullari mavjud. Masalan, sizda bir nechta kolonkalardan tashkil topgan qatorli unik kalit bo'lishi mumkin. Va ob'ektni bazaga yozishda, barcha bu kolonkalarning to'ldirilishi kerak bo'ladi.

Men ularni batafsil ko'rsatib o'tirmayman. Axir, bizning darslarimizning vazifasi - Hibernate bilan tanishtirish, rasmiy hujjatlarni takrorlash emas.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION