JavaRush /Kurslar /All lectures for TK purposes /Maglumatlary täzelenmegi Dolandyrmak

Maglumatlary täzelenmegi Dolandyrmak

All lectures for TK purposes
Dereje , Sapak
Elýeterli

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

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