zoukankan      html  css  js  c++  java
  • JPA中EntityListeners注解的使用

    使用场景

    EntityListeners在jpa中使用,如果你是mybatis是不可以用的

    它的意义

    对实体属性变化的跟踪,它提供了保存前,保存后,更新前,更新后,删除前,删除后等状态,就像是拦截器一样,你可以在拦截方法里重写你的个性化逻辑。

    它的使用

    定义某种功能类型

    @Embeddable注解表示这个对象不是单独的数据表,它里面的字段会在其它实体中公用

    /**
     * 数据建立与更新.
     * 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注解表示它是一个内嵌到当前实体里的对象,它自己不是实体,它只表示实体里某些字段。

    @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等。

  • 相关阅读:
    em
    How to locate a path?
    云图说 | 揭秘云硬盘高可靠性的秘密,速来围观
    【华为云技术分享】开发团队中的任务没人领取,你头疼吗?
    介绍一种更方便的代理池实现方案
    4行Python代码生成图像验证码
    【华为云技术分享】机器学习(02)——学习资料链接
    【华为云技术分享】华为开发者大会HDC.Cloud带你探索强化学习三大挑战及落地实践
    【华为云技术分享】【一统江湖的大前端(8)】matter.js 经典物理
    华为开发者大会HDC.Cloud硬核技术解读:知识图谱构建流程及方法
  • 原文地址:https://www.cnblogs.com/lori/p/10243256.html
Copyright © 2011-2022 走看看