5.1 डेटा बदलण्याची वेळ
जेव्हा तुम्ही अनेक वर्षे डेटाबेसमध्ये विविध रेकॉर्ड साठवता तेव्हा दोन प्रश्न अनेकदा उद्भवतात:
- ही नोंद डेटाबेसमध्ये कधी जोडली गेली?
- ही नोंद शेवटची कधी बदलली होती?
ही अशी वारंवार कार्ये आहेत की डेटाबेसमधील जवळजवळ प्रत्येक टेबलवर दोन स्तंभ जोडले जातात:
- तयार_वेळ
- अपडेट_टाइम
प्रथम रेकॉर्ड तयार केल्याची तारीख आणि वेळ संग्रहित करते आणि दुसरी तारीख आणि वेळ ती शेवटची सुधारित करते. आणि प्रत्येक घटक वर्गात फील्ड आहेत:
@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 | ऑब्जेक्ट डेटाबेसमध्ये सेव्ह करण्यापूर्वी कॉल केला जातो. (SQL INSERT) |
@PostPersist | ऑब्जेक्ट डेटाबेसमध्ये सेव्ह केल्यानंतर लगेच कॉल केला जातो. (SQL INSERT) |
@PreRemove | डेटाबेसमधील ऑब्जेक्ट हटवण्यापूर्वी कॉल केला जातो. |
@PostRemove | डेटाबेसमधून ऑब्जेक्ट हटविल्यानंतर कॉल केला जातो. |
@PreUpdate | डेटाबेसमधील ऑब्जेक्ट अपडेट करण्यापूर्वी (SQL अपडेट) कॉल केला जातो. |
@PostUpdate | डेटाबेसमधील ऑब्जेक्टच्या अपडेट (SQL अपडेट) नंतर कॉल केला जातो. |
@पोस्टलोड | डेटाबेसमधून ऑब्जेक्ट लोड केल्यानंतर कॉल केला जातो. |
चला एक उदाहरण लिहूया जिथे आपण वर्गाला त्याचे ऑब्जेक्ट्स तयार आणि अपडेट करण्यासाठी योग्य वेळ सांगू:
@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 आमचे घटक श्रोते जोडणे
तुम्हाला खरोखरच हवे असल्यास, तुम्ही हायबरनेट ज्या पध्दतींना कॉल करते त्या ऑब्जेक्टपासून विभक्त करू शकता. जेपीए स्पेसिफिकेशन तुम्हाला श्रोता वर्ग घोषित करण्यास अनुमती देते जे एंटिटी ऑब्जेक्ट्सवर प्रक्रिया करताना विशिष्ट वेळी कॉल केले जातील.
जर तुमच्याकडे अनेक समान घटक वस्तू असतील, तर तुम्ही त्यातील काही बेस क्लासमध्ये हलवू शकता आणि त्यांच्या वर्तनावर नियंत्रण ठेवणारा श्रोता जोडू शकता. उदाहरण:
@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;
}