5.1 Maglumatlaryň üýtgemegi wagty
Veri bazasynda dürli ýazgylary köp ýyllap saklaýan wagtyň, köplenç iki sorag ýüze çykýar:
- Bu ýazgy baza haçan goşuldy?
- Bu ýazgy soňky gezek haçan üýtgedildi?
Bu meseleler şonuň ýaly köpdürli we adatça maglumat bazasynyň her tablisasynda iki sütün goşulýar:
- created_time
- updated_time
Birinji sütün ýazgyň döredilen wagtyny, ikinji sütün bolsa onuň soňky gezek üýtgedilen wagtyny saklaýar. Her Entity-klasda meýdanlar bar:
@Entity
@Table(name = "entities")
public class Entity {
...
@Column(name="created_time")
private Date created;
@Column(name="updated_time")
private Date updated;
}
Hibernate, iki annotasiýanyň kömegi bilen obýektleriň üýtgemek wagtyny dolandyrmagy öz üstüne alyp biler: @CreationTimestamp
we @UpdateTimestamp
.
Mysal:
@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;
}
Bu annotasiýalar bilen bellik edilen sütinlerde obýektiň döredilen wagty we soňky üýtgedilen wagty hemişe dogry saklanar.
5.2 @PrePersist Annotasiýasy
Has çylşyrymly senariýalary kontrol etmek isleseň, Hibernate seniň üçin başga annotasiýalary hem bar. Bu annotasiýalar bilen klas metode bellik edip, Hibernate obýekti baza ýazanda bu metodlary çagyrar. Jemi 7 sany şeýle annotasiýa bar:
@PrePersist | Obýekti baza ýazmazdan öň çagyrylýar. (SQL INSERT) |
@PostPersist | Obýekti baza ýazandan soň derrew çagyrylýar. (SQL INSERT) |
@PreRemove | Obýekti bazadan aýyrmazdan öň çagyrylýar. |
@PostRemove | Obýekti bazadan aýyrandan soň çagyrylýar. |
@PreUpdate | Obýekti bazada täzelän öň (SQL UPDATE) çagyrylýar. |
@PostUpdate | Obýekti bazada täzelän soň (SQL UPDATE) çagyrylýar. |
@PostLoad | Obýekt bazadan ýüklenenden soň çagyrylýar. |
Geliň bir mysal ýazaýalyň, bu ýerde obýektleriň dogry döredilen we täzelenen wagtyny klassda bellemek üçin amal ederiz:
@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 obýekti ilkinji gezek ýazanda, @PrePersist annotasiýasy bilen bellik edilen metodu çagyrar. Eger obýekti täzelän bolsa, @PreUpdate annotasiýasy bilen bellik edilen metodu çagyrar.
5.3 Öz EntityListeners Goşmak
Eger seniň üçin gerek bolsa, Hibernate çagyrýan metodlaryny we olary çagyrýan obýekti aýyryp bilersiň. JPA spesifikasiýasy, Entity-obýektleri dolandyrýanlykda belli pursatlarda çagyrjak listener-klaslaryny yglan etmäge mümkinçilik berýär.
Ulanylan Entity-obýektleriň köp bolsa, seň olar üçin bir esas klass döredip, olaryň hereketlerini dolandyrýan Listener goşup bilersiň. Mysal:
@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 klassy üçin ýörite listener-klas döredip bolar:
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) );
}
}
We User klassyny we onuň listenerini birnäçe annotasiýanyň kömegi bilen baglanyşdyryp bolýar:
@Entity @EntityListeners(class= TimeEntityListener.class)
public class User extends BaseEntity {
@Id
private Long id;
private String name;
}
GO TO FULL VERSION