使用場景sql
EntityListeners在jpa中使用,若是你是mybatis是不能夠用的mybatis
它的意義架構
對實體屬性變化的跟蹤,它提供了保存前,保存後,更新前,更新後,刪除前,刪除後等狀態,就像是攔截器同樣,你能夠在攔截方法裏重寫你的個性化邏輯。併發
它的使用分佈式
定義某種功能類型ide
@Embeddable註解表示這個對象不是單獨的數據表,它裏面的字段會在其它實體中公用 /**高併發
@Column(name = "created_on") private LocalDateTime createdOn;性能
@Column(name = "created_by") private String createdBy;學習
@Column(name = "updated_on") private LocalDateTime updatedOn;this
@Column(name = "updated_by") private String updatedBy; } 定義接口,對上面類型進行讀和寫的行爲
/**
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註解表示它是一個內嵌到當前實體裏的對象,它本身不是實體,它只表示實體裏某些字段。 @EntityListeners(DataEntityListener.class) public class Product implements DataEntity { /**
@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等。 歡迎工做一到五年的Java工程師朋友們加入Java羣: 741514154 羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!