使用場景
EntityListeners在jpa中使用,如果你是mybatis是不可以用的
它的意義
對實(shí)體屬性變化的跟蹤跨晴,它提供了保存前决采,保存后,更新前坟奥,更新后树瞭,刪除前拇厢,刪除后等狀態(tài),就像是攔截器一樣晒喷,你可以在攔截方法里重寫你的個性化邏輯孝偎。
它的使用
定義某種功能類型
@Embeddable注解表示這個對象不是單獨(dú)的數(shù)據(jù)表,它里面的字段會在其它實(shí)體中公用
/**
* 數(shù)據(jù)建立與更新.
* Embeddable注解表示不會生成新的數(shù)據(jù)表凉敲,而它的屬性會在其它表內(nèi)部衣盾,比較容易實(shí)現(xiàn)代碼復(fù)用.
*/@Getter@Setter@Embeddablepublic 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;}
定義接口,對上面類型進(jìn)行讀和寫的行為
/**
* 數(shù)據(jù)建立與更新.
*/publicinterfaceAuditable{AuditgetAudit();voidsetAudit(Audit audit);}
定義跟蹤器爷抓,接口參數(shù)會在具體實(shí)現(xiàn)類中傳過來
/** * Hibernate 事件監(jiān)聽器. * 實(shí)體監(jiān)聽@EntityListeners(AuditListener.class). */@Slf4j@Component@TransactionalpublicclassAuditListener{@PrePersistpublicvoidsetCreatedOn(Auditable auditable){? ? Audit audit = auditable.getAudit();if(audit ==null) {? ? ? audit =newAudit();? ? ? auditable.setAudit(audit);? ? }? ? audit.setCreatedOn(LocalDateTime.now());? ? audit.setUpdatedOn(LocalDateTime.now());? }@PreUpdatepublicvoidsetUpdatedOn(Auditable auditable){? ? Audit audit = auditable.getAudit();? ? audit.setUpdatedOn(LocalDateTime.now());? }}
實(shí)體去實(shí)現(xiàn)這個對應(yīng)的跟蹤接口
@Embedded注解表示它是一個內(nèi)嵌到當(dāng)前實(shí)體里的對象势决,它自己不是實(shí)體,它只表示實(shí)體里某些字段蓝撇。
@EntityListeners(DataEntityListener.class)publicclassProductimplementsDataEntity{/**
? * 存儲復(fù)雜對象內(nèi)的元素.
? */@EmbeddedprivateAudit audit;@OverridepublicAuditgetAudit(){returnaudit;? }@OverridepublicvoidsetAudit(Audit audit){this.audit = audit;? }}
上面代碼將實(shí)現(xiàn)在實(shí)體保存時對Audit實(shí)體里的createdOn果复,updateOn進(jìn)行賦值,當(dāng)實(shí)體進(jìn)行更新時對updateOn進(jìn)行重新賦值的操作渤昌。
注意虽抄,在當(dāng)前實(shí)體Product對應(yīng)的數(shù)據(jù)表里,它會有Audit類型里的屬性独柑,即它的數(shù)據(jù)表字段會有created_on,created_by,updated_on和updated_by等迈窟。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 歡迎工作一到五年的Java工程師朋友們加入Java群:?741514154
群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)忌栅、高性能及分布式车酣、Jvm性能調(diào)優(yōu)、Spring源碼索绪,MyBatis湖员,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰者春!趁年輕,使勁拼清女,給未來的自己一個交代钱烟!