5.1 рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рдордп

рдЬрдм рдЖрдк рдХрд┐рд╕реА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рддрдХ рд╡рд┐рднрд┐рдиреНрди рд░рд┐рдХреЙрд░реНрдб рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдХреНрд╕рд░ рджреЛ рдкреНрд░рд╢реНрди рдЙрдарддреЗ рд╣реИрдВ:

  • рдпрд╣ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрдм рдЬреЛрдбрд╝реА рдЧрдИ рдереА?
  • рдпрд╣ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХрдм рдмрджрд▓реА рдЧрдИ рдереА?

рдпреЗ рдРрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рд░реНрдп рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджреЛ рдХреЙрд▓рдо рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ:

  • create_time
  • рдЕрдкрдбреЗрдЯ_рд╕рдордп

рдкрд╣рд▓рд╛ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреА рддрд┐рдерд┐ рдФрд░ рд╕рдордп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЙрд╕ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдВрддрд┐рдо рдмрд╛рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рд╡рд░реНрдЧ рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╣реИрдВ:

@Entity
@Table(name = "entities")
public class Entity {
  ...

  @Column(name="created_time")
  private Date created;

  @Column(name="updated_time")
  private Date updated;
}

рдЬрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджреЛ рдПрдиреЛрдЯреЗрд╢рди @CreationTimestampрдФрд░ @UpdateTimestamp.

рдЙрджрд╛рд╣рд░рдг:

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

рдЗрди рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХреЙрд▓рдо рд╣рдореЗрд╢рд╛ рд╕рд╣реА рд╕рдордп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЬрдм рдЗрд╕реЗ рдЕрдВрддрд┐рдо рдмрд╛рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

5.2 @PrePersist рдПрдиреЛрдЯреЗрд╢рди

рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕рдордп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЬрдЯрд┐рд▓ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВред рд╡реЗ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬрдм рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рдХреБрд▓ 7 рдРрд╕реЗ рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВ:

@PrePersist рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдПрд╕рдХреНрдпреВрдПрд▓ рдЗрдВрд╕рд░реНрдЯ)
@рдкреЛрд╕реНрдЯрдкрд░реНрд╕рд┐рд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдПрд╕рдХреНрдпреВрдПрд▓ рдЗрдВрд╕рд░реНрдЯ)
@PreRemove рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
@PostRemove рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@PreUpdate рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ (SQL UPDATE) рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@рдкреЛрд╕реНрдЯрдЕрдкрдбреЗрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдкрдбреЗрдЯ (рдПрд╕рдХреНрдпреВрдПрд▓ рдЕрдкрдбреЗрдЯ) рдХреЗ рдмрд╛рдж рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
@рдкреЛрд╕реНрдЯрд▓реЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдЙрд╕рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рд╕рдордп рдмрддрд╛рддреЗ рд╣реИрдВ:

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

рдпрджрд┐ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдкрд╣рд▓реА рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдиреЛрдЯреЗрдЯреЗрдб рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ @PrePersistред рдпрджрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ @PreUpdateред

5.3 рд╣рдорд╛рд░реЗ EntityListeners рдХреЛ рдЬреЛрдбрд╝рдирд╛

рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЙрд▓ рдХреЛ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЬреЗрдкреАрдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЖрдкрдХреЛ рд╢реНрд░реЛрддрд╛ рд╡рд░реНрдЧреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрдХрд╛рдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕реА рд╕рдорд╛рди рдЗрдХрд╛рдИ рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╢реНрд░реЛрддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг:

@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 рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╢реНрд░реЛрддрд╛ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдФрд░ рдЖрдк рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдФрд░ рдЙрд╕рдХреЗ рд╢реНрд░реЛрддрд╛ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

@Entity
@EntityListeners(class= TimeEntityListener.class)
public class User extends BaseEntity {

     @Id
     private Long id;

     private String name;
}