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;
}
GO TO FULL VERSION