JPA中EntityListeners註解的使用

使用場景

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實體裏的createdOnupdateOn進行賦值,當實體進行更新時對updateOn進行從新賦值的操做。對象

注意,在當前實體Product對應的數據表裏,它會有Audit類型裏的屬性,即它的數據表字段會有created_on,created_by,updated_onupdated_by等。接口

相關文章
相關標籤/搜索