0
点赞
收藏
分享

微信扫一扫

JPA中EntityListeners注解的使用

栖桐 2022-08-25 阅读 66

使用场景

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

作者:仓储大叔,张占岭,
荣誉:微软MVP

JPA中EntityListeners注解的使用_字段



举报

相关推荐

0 条评论