CodeGym /Kursus /SQL & Hibernate /Manajemen penyegaran data

Manajemen penyegaran data

SQL & Hibernate
Level 12 , Pelajaran 4
Tersedia

5.1 Waktu perubahan data

Saat Anda menyimpan berbagai catatan dalam database selama bertahun-tahun, dua pertanyaan sering muncul:

  • Kapan entri ini ditambahkan ke database?
  • Kapan entri ini terakhir diubah?

Ini adalah tugas yang sering dilakukan sehingga dua kolom ditambahkan ke hampir setiap tabel dalam database:

  • waktu_dibuat
  • diperbarui_waktu

Yang pertama menyimpan tanggal dan waktu rekaman dibuat, dan yang kedua menyimpan tanggal dan waktu terakhir diubah. Dan setiap kelas Entitas memiliki bidang:


@Entity
@Table(name = "entities")	
public class Entity {
  ...
 
  @Column(name="created_time")
  private Date created;
 
  @Column(name="updated_time")
  private Date updated;
}

Hibernasi dapat melakukan semua pekerjaan pengontrolan saat objek dalam database diperbarui dengan dua anotasi @CreationTimestampdan @UpdateTimestamp.

Contoh:

@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 yang ditandai dengan anotasi ini akan selalu menyimpan waktu yang tepat saat objek dibuat dan kapan terakhir diubah.

5.2 anotasi @PrePersist

Jika Anda memerlukan beberapa skrip yang lebih kompleks untuk mengontrol waktu suatu objek, maka Hibernate juga memiliki anotasi untuk kasus ini. Mereka dapat menandai metode kelas, dan Hibernate akan memanggil metode ini saat menyimpan objek ke database. Ada total 7 anotasi seperti itu:

@PrePersist Dipanggil sebelum objek disimpan ke database. (MASUKKAN SQL)
@PostPersist Dipanggil segera setelah objek disimpan ke database. (MASUKKAN SQL)
@PreRemove Dipanggil sebelum menghapus objek di database.
@PostRemove Dipanggil setelah objek dihapus dari database.
@PreUpdate Dipanggil sebelum mengupdate (SQL UPDATE) objek di database.
@PostUpdate Dipanggil setelah update (SQL UPDATE) dari sebuah objek di database.
@postload Dipanggil setelah objek dimuat dari database.

Mari tulis sebuah contoh di mana kita memberi tahu kelas waktu yang tepat untuk membuat dan memperbarui objeknya:

@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();
  }
}

Jika Hibernate menyimpan objek untuk pertama kalinya, maka ia akan memanggil metode yang dianotasi dengan @PrePersist. Jika memperbarui objek yang ada di database, itu akan memanggil metode yang ditandai dengan anotasi @PreUpdate.

5.3 Menambahkan EntityListeners kita

Jika Anda benar-benar membutuhkannya, maka Anda dapat memisahkan metode yang dipanggil Hibernasi dari objek yang dipanggilnya. Spesifikasi JPA memungkinkan Anda mendeklarasikan kelas pendengar yang akan dipanggil pada waktu tertentu saat memproses objek Entitas.

Jika Anda memiliki banyak objek Entitas yang serupa, Anda dapat memindahkan beberapa objek tersebut ke dalam kelas dasar dan menambahkan Pendengar yang akan mengontrol perilakunya. Contoh:


@MappedSuperclass
public abstract class BaseEntity {
 
    private Timestamp createdOn;
 
    private Timestamp updatedOn;
 
}


@Entity
public class User extends BaseEntity {
 
     @Id
     private Long id;
 
     private String name;
}

Kemudian untuk kelas BaseEntity, Anda bisa membuat kelas pendengar 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)   );
    }
}

Dan Anda dapat menghubungkan kelas Pengguna dan pendengarnya menggunakan beberapa anotasi:


@Entity
@EntityListeners(class= TimeEntityListener.class)
public class User extends BaseEntity {
 
     @Id
     private Long id;
 
     private String name;
}

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION