JPA中EntityListeners注解(jie)的使(shi)用
使用場景
EntityListeners在jpa中使用,如果你是(shi)mybatis是(shi)不可(ke)以用的(de)
它的意義
對實體屬性變化的跟蹤,它提供了保存前,保存后,更新(xin)前,更新(xin)后,刪除前,刪除后等狀態,就(jiu)像是攔截器一樣,你(ni)可以在(zai)攔截方法里重寫你(ni)的個性化邏輯。
它的使用
定義某種功能類型
@Embeddable注(zhu)解(jie)表示這個對象(xiang)不是單獨的(de)數據表,它里面的(de)字(zi)段會在(zai)其它實體中(zhong)公用
/**
* 數據建立與更新.
* 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注解表(biao)示(shi)它(ta)是(shi)一(yi)個內(nei)嵌到當前(qian)實(shi)體里(li)的對象,它(ta)自(zi)己不是(shi)實(shi)體,它(ta)只表(biao)示(shi)實(shi)體里(li)某些字(zi)段。
@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進(jin)行重新賦值的(de)操(cao)作。
注意,在當前實體Product對應的數據表里,它會有Audit類型里的屬性,即它的數據表字段會有
created_on,created_by,updated_on和updated_by等。