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