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) |
@முன் அகற்று | தரவுத்தளத்தில் உள்ள ஒரு பொருளை நீக்கும் முன் அழைக்கப்பட்டது. |
@PostRemove | தரவுத்தளத்திலிருந்து ஒரு பொருள் நீக்கப்பட்ட பிறகு அழைக்கப்படும். |
@PreUpdate | தரவுத்தளத்தில் ஒரு பொருளைப் புதுப்பிக்கும் முன் (SQL UPDATE) அழைக்கப்பட்டது. |
@PostUpdate | தரவுத்தளத்தில் உள்ள ஒரு பொருளின் புதுப்பிப்புக்குப் பிறகு (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 ஐச் சேர்த்தல்
உங்களுக்கு உண்மையிலேயே தேவைப்பட்டால், ஹைபர்னேட் அழைக்கும் முறைகளை அது அழைக்கும் பொருளிலிருந்து பிரிக்கலாம். JPA விவரக்குறிப்பு, நிறுவனப் பொருட்களைச் செயலாக்கும்போது குறிப்பிட்ட நேரங்களில் அழைக்கப்படும் கேட்போர் வகுப்புகளை அறிவிக்க உங்களை அனுமதிக்கிறது.
உங்களிடம் ஒரே மாதிரியான பல பொருள்கள் இருந்தால், அவற்றில் சிலவற்றை அடிப்படை வகுப்பிற்கு நகர்த்தி, அவற்றின் நடத்தையைக் கட்டுப்படுத்தும் ஒரு கேட்பவரைச் சேர்க்கலாம். உதாரணமாக:
@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;
}