JPA中EntityListeners注解的使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA中EntityListeners注解的使用相关的知识,希望对你有一定的参考价值。
使用场景
EntityListeners在jpa中使用,如果你是mybatis是不可以用的
它的意义
对实体属性变化的跟踪,它提供了保存前,保存后,更新前,更新后,删除前,删除后等状态,就像是拦截器一样,你可以在拦截方法里重写你的个性化逻辑。
它的使用
定义某种功能类型
@Embeddable注解表示这个对象不是单独的数据表,它里面的字段会在其它实体中公用
/**
- 数据建立与更新.
-
Embeddable注解表示不会生成新的数据表,而它的属性会在其它表内部,比较容易实现代码复用.br/>*/
@Getter
@Setterbr/>@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).br/>*/
@Slf4j
@Componentbr/>@Transactional
public class AuditListener {br/>@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注解表示它是一个内嵌到当前实体里的对象,它自己不是实体,它只表示实体里某些字段。br/>@EntityListeners(DataEntityListener.class)
public class Product implements DataEntity {
/**
-
存储复杂对象内的元素.br/>*/
@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等。 欢迎工作一到五年的Java工程师朋友们加入Java群: 741514154
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,mysql,Zookeeper,Tomcat,Docker,Dubbo,nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
以上是关于JPA中EntityListeners注解的使用的主要内容,如果未能解决你的问题,请参考以下文章
Caused by: java.lang.ClassNotFoundException: javax.persistence.EntityListeners