EntityListeners在jpa中使用,若是你是mybatis是不能夠用的mybatis
對實體屬性變化的跟蹤,它提供了保存前,保存後,更新前,更新後,刪除前,刪除後等狀態,就像是攔截器同樣,你能夠在攔截方法裏重寫你的個性化邏輯。ide
@Embeddable註解表示這個對象不是單獨的數據表,它裏面的字段會在其它實體中公用this
/** * 數據創建與更新. * Embeddable註解表示不會生成新的數據表,而它的屬性會在其它表內部,比較容易實現代碼複用. */ @Getter @Setter @Embeddable public class Audit { @Column(name = "created_on") private LocalDateTime createdOn; @Column(name = "created_by") private String createdBy; @Column(name = "updated_on") private LocalDateTime updatedOn; @Column(name = "updated_by") private String updatedBy; }
/** * 數據創建與更新. */ public interface Auditable { Audit getAudit(); void setAudit(Audit audit); }
/** * Hibernate 事件監聽器. * 實體監聽@EntityListeners(AuditListener.class). */ @Slf4j @Component @Transactional public class AuditListener { @PrePersist public void setCreatedOn(Auditable auditable) { Audit audit = auditable.getAudit(); if (audit == null) { audit = new Audit(); auditable.setAudit(audit); } audit.setCreatedOn(LocalDateTime.now()); audit.setUpdatedOn(LocalDateTime.now()); } @PreUpdate public void setUpdatedOn(Auditable auditable) { Audit audit = auditable.getAudit(); audit.setUpdatedOn(LocalDateTime.now()); } }
@Embedded註解表示它是一個內嵌到當前實體裏的對象,它本身不是實體,它只表示實體裏某些字段。code
@EntityListeners(DataEntityListener.class) public class Product implements DataEntity { /** * 存儲複雜對象內的元素. */ @Embedded private Audit audit; @Override public Audit getAudit() { return audit; } @Override public void setAudit(Audit audit) { this.audit = audit; } }
上面代碼將實如今實體保存時對Audit實體裏的createdOn
,updateOn
進行賦值,當實體進行更新時對updateOn
進行從新賦值的操做。對象
注意,在當前實體Product對應的數據表裏,它會有Audit類型裏的屬性,即它的數據表字段會有
created_on
,created_by
,updated_on
和updated_by
等。接口