5.1 Wektu pangowahan data
Nalika sampeyan nyimpen macem-macem cathetan ing database nganti pirang-pirang taun, rong pitakonan asring muncul:
- Nalika entri iki ditambahake menyang database?
- Nalika entri iki pungkasan diganti?
Iki minangka tugas sing kerep banget nganti rong kolom ditambahake ing meh saben tabel ing basis data:
- digawe_wektu
- dianyari_wektu
Sing pisanan nyimpen tanggal lan wektu rekaman digawe, lan sing nomer loro nyimpen tanggal lan wektu sing pungkasan diowahi. Lan saben kelas Entitas duwe lapangan:
@Entity
@Table(name = "entities")
public class Entity {
...
@Column(name="created_time")
private Date created;
@Column(name="updated_time")
private Date updated;
}
Hibernate bisa nindakake kabeh kontrol nalika obyek ing database dianyari karo rong anotasi @CreationTimestamp
lan @UpdateTimestamp
.
Tuladha:
@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;
}
Kolom sing ditandhani karo anotasi kasebut bakal nyimpen wektu sing bener nalika obyek digawe lan kapan pungkasan diowahi.
5.2 @PrePersist anotasi
Yen sampeyan butuh sawetara skrip sing luwih rumit kanggo ngontrol wektu obyek, banjur Hibernate uga duwe anotasi kanggo kasus iki. Dheweke bisa menehi tandha metode kelas, lan Hibernate bakal nelpon metode kasebut nalika nyimpen obyek menyang database. Ana 7 anotasi kasebut kanthi total:
@PrePersist | Disebut sadurunge obyek disimpen ing database. (SQL INSERT) |
@PostPersist | Ditelpon langsung sawise obyek disimpen ing database. (SQL INSERT) |
@PreRemove | Ditelpon sadurunge mbusak obyek ing database. |
@PostRemove | Disebut sawise obyek wis dibusak saka database. |
@PreUpdate | Disebut sadurunge nganyari (SQL UPDATE) obyek ing database. |
@PostUpdate | Disebut sawise nganyari (SQL UPDATE) saka obyek ing database. |
@postload | Disebut sawise obyek wis dimuat saka database. |
Ayo nulis conto ing ngendi kita ngandhani kelas wektu sing bener kanggo nggawe lan nganyari obyek kasebut:
@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();
}
}
Yen Hibernate nyimpen obyek kanggo pisanan, banjur bakal nelpon cara anotasi karo @PrePersist
. Yen nganyari obyek sing ana ing database, bakal nelpon cara sing ditandhani karo anotasi @PreUpdate
.
5.3 Nambahake EntityListeners kita
Yen pancene perlu, sampeyan bisa misahake cara sing diarani Hibernate saka obyek sing diarani. Spesifikasi JPA ngidini sampeyan ngumumake kelas pamireng sing bakal diarani ing wektu tartamtu nalika ngolah obyek Entitas.
Yen sampeyan duwe akeh obyek Entitas sing padha, sampeyan bisa mindhah sawetara menyang kelas dhasar lan nambah Listener sing bakal ngontrol prilaku. Tuladha:
@MappedSuperclass
public abstract class BaseEntity {
private Timestamp createdOn;
private Timestamp updatedOn;
}
@Entity
public class User extends BaseEntity {
@Id
private Long id;
private String name;
}
Banjur kanggo kelas BaseEntity, sampeyan bisa nggawe kelas pamireng khusus:
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) );
}
}
Lan sampeyan bisa nyambungake kelas Panganggo lan pamireng nggunakake sawetara anotasi:
@Entity
@EntityListeners(class= TimeEntityListener.class)
public class User extends BaseEntity {
@Id
private Long id;
private String name;
}