5.1 डेटा परिवर्तन का समय
जब आप किसी डेटाबेस में कई वर्षों तक विभिन्न रिकॉर्ड संग्रहीत करते हैं, तो अक्सर दो प्रश्न उठते हैं:
- यह प्रविष्टि डेटाबेस में कब जोड़ी गई थी?
- यह प्रविष्टि पिछली बार कब बदली गई थी?
ये ऐसे लगातार कार्य हैं कि डेटाबेस में लगभग हर तालिका में दो कॉलम जोड़े जाते हैं:
- create_time
- अपडेट_समय
पहला रिकॉर्ड बनाए जाने की तिथि और समय को संग्रहीत करता है, और दूसरा उस दिनांक और समय को संग्रहीत करता है जिसे अंतिम बार संशोधित किया गया था। और प्रत्येक इकाई वर्ग में फ़ील्ड हैं:
@Entity
@Table(name = "entities")
public class Entity {
...
@Column(name="created_time")
private Date created;
@Column(name="updated_time")
private Date updated;
}
जब डेटाबेस में ऑब्जेक्ट को दो एनोटेशन @CreationTimestamp
और @UpdateTimestamp
.
उदाहरण:
@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;
}
इन एनोटेशन के साथ चिह्नित कॉलम हमेशा सही समय संग्रहीत करेंगे जब ऑब्जेक्ट बनाया गया था और जब इसे अंतिम बार संशोधित किया गया था।
5.2 @PrePersist एनोटेशन
यदि आपको किसी वस्तु के समय को नियंत्रित करने के लिए कुछ और जटिल लिपियों की आवश्यकता है, तो हाइबरनेट में इस मामले के लिए भी एनोटेशन हैं। वे वर्ग विधियों को चिह्नित कर सकते हैं, और हाइबरनेट इन विधियों को कॉल करेगा जब यह ऑब्जेक्ट को डेटाबेस में सहेजता है। कुल 7 ऐसे एनोटेशन हैं:
@PrePersist | ऑब्जेक्ट को डेटाबेस में सहेजे जाने से पहले कॉल किया जाता है। (एसक्यूएल इंसर्ट) |
@पोस्टपर्सिस्ट | ऑब्जेक्ट को डेटाबेस में सहेजे जाने के तुरंत बाद कॉल किया जाता है। (एसक्यूएल इंसर्ट) |
@PreRemove | डेटाबेस में किसी ऑब्जेक्ट को हटाने से पहले कॉल किया गया। |
@PostRemove | किसी वस्तु को डेटाबेस से हटाए जाने के बाद कॉल किया जाता है। |
@PreUpdate | डेटाबेस में किसी ऑब्जेक्ट को अपडेट (SQL UPDATE) करने से पहले कॉल किया जाता है। |
@पोस्टअपडेट | डेटाबेस में किसी ऑब्जेक्ट के अपडेट (एसक्यूएल अपडेट) के बाद कॉल किया गया। |
@पोस्टलोड | ऑब्जेक्ट को डेटाबेस से लोड करने के बाद कॉल किया जाता है। |
आइए एक उदाहरण लिखते हैं जहां हम एक वर्ग को उसकी वस्तुओं को बनाने और अद्यतन करने का सही समय बताते हैं:
@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();
}
}
यदि हाइबरनेट पहली बार ऑब्जेक्ट को सहेजता है, तो यह एनोटेटेड विधि को कॉल करेगा @PrePersist
। यदि यह डेटाबेस में किसी मौजूदा ऑब्जेक्ट को अपडेट करता है, तो यह एनोटेशन के साथ चिह्नित विधि को कॉल करेगा @PreUpdate
।
5.3 हमारे EntityListeners को जोड़ना
यदि आपको वास्तव में आवश्यकता है, तो आप उन तरीकों को अलग कर सकते हैं जो हाइबरनेट कॉल को उस ऑब्जेक्ट से अलग कर सकते हैं जिस पर वह उन्हें कॉल करता है। जेपीए विनिर्देश आपको श्रोता वर्गों की घोषणा करने की अनुमति देता है जिन्हें इकाई वस्तुओं को संसाधित करते समय निश्चित समय पर बुलाया जाएगा।
यदि आपके पास बहुत सी समान इकाई वस्तुएं हैं, तो आप उनमें से कुछ को आधार वर्ग में ले जा सकते हैं और एक श्रोता जोड़ सकते हैं जो उनके व्यवहार को नियंत्रित करेगा। उदाहरण:
@MappedSuperclass
public abstract class BaseEntity {
private Timestamp createdOn;
private Timestamp updatedOn;
}
@Entity
public class User extends BaseEntity {
@Id
private Long id;
private String name;
}
तब BaseEntity वर्ग के लिए, आप एक विशेष श्रोता वर्ग बना सकते हैं:
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) );
}
}
और आप कुछ एनोटेशन का उपयोग करके उपयोगकर्ता वर्ग और उसके श्रोता को जोड़ सकते हैं:
@Entity
@EntityListeners(class= TimeEntityListener.class)
public class User extends BaseEntity {
@Id
private Long id;
private String name;
}