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

  • 相关阅读:
    [PHP] 小数转科学计数法, 小数保留 n 位
    [Blockchain] Cosmos Starport 101
    [Blockchain] Cosmos Starport 地址前缀的变更方式
    [Blockchain] Cosmos Starport 安装的三种方式
    [ML] 机器学习的 7 步走
    [FAQ] MEMORY ALLOC FAILED: mmap with HUGETLB failed, attempting without it (you should fix your kernel)
    [FAQ] FastAdmin epay 微信公众号支付 JSAPI 支付必须传 openid ?
    [TP5] 动态绑定指定默认模块, 解决: 控制器不存在:appindexcontrollerApi
    [TP5] ThinkPHP 默认模块和单模块的设置方式
    [TP5] 浅谈 ThinkPHP 的 Hook 行为事件及监听执行
  • 原文地址:https://www.cnblogs.com/lori/p/10243256.html
Copyright © 2011-2022 走看看