使用场景

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实体里的createdOn,updateOn进行赋值,当实体进行更新时对updateOn进行重新赋值的操作。

注意,在当前实体Product对应的数据表里,它会有Audit类型里的属性,即它的数据表字段会有created_on,created_by,
updated_on和updated_by等。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信