使用場景
EntityListeners在jpa中使用,如果你是mybatis是不可以用的
它的意義
對實體屬性變化的跟蹤,它提供了保存前,保存後,更新前,更新後,刪除前,刪除後等狀態,就像是攔截器一樣,你可以在攔截方法裏重寫你的個性化邏輯。
它的使用
定義某種功能類型
@Embeddable註解表示這個對象不是單獨的數據表,它裏面的字段會在其它實體中公用
/**
- 數據建立與更新.
-
Embeddable註解表示不會生成新的數據表,而它的屬性會在其它表內部,比較容易實現代碼複用.br/>*/
@Getter
@Setterbr/>@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).br/>*/
@Slf4j
@Componentbr/>@Transactional
public class AuditListener {br/>@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註解表示它是一個內嵌到當前實體裏的對象,它自己不是實體,它只表示實體裏某些字段。br/>@EntityListeners(DataEntityListener.class)
public class Product implements DataEntity {
/**
-
存儲複雜對象內的元素.br/>*/
@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等。 歡迎工作一到五年的Java工程師朋友們加入Java羣: 741514154
羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!