Manajemen refresh data

kasedhiya

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 @CreationTimestamplan @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;
}

Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar