JavaRush /Kurslar /All lectures for UZ purposes /Ma'lumotlarni Yangilashni Boshqarish

Ma'lumotlarni Yangilashni Boshqarish

All lectures for UZ purposes
Daraja, Dars
Mavjud

5.1 Ma'lumotlarni o'zgartirish vaqti

Yillar davomida bazaga turli yozuvlarni saqlaganda, juda ko'p ikki savol tug'iladi:

  • Bu yozuv qachon bazaga qo'shilgan edi?
  • Bu yozuv oxirgi marta qachon o'zgartirilgan edi?

Bu shunchalik keng tarqalgan vazifalarki, deyarli har bir jadvalga ikki ustun qo'shiladi:

  • created_time
  • updated_time

Birinchisida yozuvni yaratish vaqti va sanasi saqlanadi, ikkinchisida esa - oxirgi o'zgartirish vaqti va sanasi. Va har bir Entity-klassida quyidagi maydonlar mavjud:


@Entity
@Table(name = "entities")	
public class Entity {
  ...
 
  @Column(name="created_time")
  private Date created;
 
  @Column(name="updated_time")
  private Date updated;
}

Hibernate barcha ma'lumotlarni yangilanish vaqtini nazorat qilish ishini @CreationTimestamp va @UpdateTimestamp ikki annotatsiyasi yordamida amalga oshirishi mumkin.

Misol:


@Entity
@Table(name = "entities")	
public class Entity {
  ...
 
	@CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "create_date")
    private Date createDate;
 
	@UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "modify_date")
	private Date modifyDate;
}

Ushbu annotatsiyalar bilan belgilangan ustunlarda har doim ob'ektning yaratilish va oxirgi o'zgartirish vaqti saqlanadi.

5.2 @PrePersist annotatsiyasi

Agar sizga ob'ekt vaqti nazorat qilish uchun qandaydir murakkabroq ssenariylar kerak bo'lsa, Hibernate-da bunday vaziyatlar uchun ham annotatsiyalar mavjud. Ulardan birini klass metodlariga qo'yishingiz mumkin va Hibernate ob'ektni bazaga saqlashda ushbu metodlarni chaqiradi. Bunday annotatsiyalar jami 7 ta:

@PrePersist Ob'ekt bazaga saqlanishdan oldin chaqiriladi. (SQL INSERT)
@PostPersist Ob'ekt bazaga saqlangandan keyin darhol chaqiriladi. (SQL INSERT)
@PreRemove Ob'ekt bazadan o'chirilishdan oldin chaqiriladi.
@PostRemove Ob'ekt bazadan o'chirilgandan keyin chaqiriladi.
@PreUpdate Ob'ekt bazada yangilanishdan (SQL UPDATE) oldin chaqiriladi.
@PostUpdate Ob'ekt bazada yangilanishdan (SQL UPDATE) keyin chaqiriladi.
@PostLoad Ob'ekt bazadan yuklanganidan keyin chaqiriladi.

Keling, ob'ektlar yaratish va yangilash vaqtini to'g'ri belgilash uchun klass yozamiz:


@Entity
@Table(name = "entities")	
public class Entity {
  ...
 
  @Column(name="created_time")
  private Date created;
 
  @Column(name="updated_time")
  private Date updated;
 
  @PrePersist
  protected void onCreate() {
    created = new Date();
  }
 
  @PreUpdate
  protected void onUpdate() {
  updated = new Date();
  }
}

Hibernate birinchi marta ob'ektni saqlaganda @PrePersist annotatsiyasi bilan belgilangan metodni chaqiradi. Agar mavjud ob'ekt bazada yangilansa, u @PreUpdate annotatsiyasi bilan belgilangan metodni chaqiradi.

5.3 O'z EntityListeners qo'shish

Agar xohlasangiz, Hibernate chaqiradigan metodlarni undan chaqiriladigan ob'ektlardan ajratib qo'yishingiz mumkin. JPA spetsifikatsiyasi sizga Entity-ob'ektlarni qayta ishlashda ma'lum bir vaqtlarda chaqiriladigan listener-klasslarni e'lon qilish imkonini beradi.

Agar sizda ko'p o'xshash Entity-ob'ektlar mavjud bo'lsa, ularning bir qismini asosiy klassga chiqarib, ularning harakatini boshqaradigan Listener qo'shishingiz mumkin. Misol:


@MappedSuperclass
public abstract class BaseEntity {
 
    private Timestamp createdOn;
 
    private Timestamp updatedOn;
 
}


@Entity
public class User extends BaseEntity {
 
     @Id
     private Long id;
 
     private String name;
}

Keyin BaseEntity klassi uchun maxsus listener-klass yaratishingiz mumkin:


public class TimeEntityListener {
 
    public void onPersist(Object entity) {
    	if (entity instanceof BaseEntity) {
        	BaseEntity baseEntity = (BaseEntity) entity;
        	baseEntity.createdOn = now();
    	}
    }
 
    public void onUpdate(Object entity) {
    	if (entity instanceof BaseEntity) {
        	BaseEntity baseEntity = (BaseEntity) entity;
        	baseEntity.updatedOn = now();
    	}
    }
 
    private Timestamp now() {
    	return Timestamp.from(LocalDateTime.now().toInstant(ZoneOffset.UTC));
    }
}

User klassi va uning listenerini bir nechta annotatsiyalar orqali bog'lashingiz mumkin:


@Entity @EntityListeners(class= TimeEntityListener.class)
public class User extends BaseEntity {
 
     @Id
     private Long id;
 
     private String name;
}

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