如何记录JPA实体EvaluationForm的增删改操作?
记录JPA实体操作的几种方案
针对你的EvaluationForm实体,要记录它的新增、编辑、删除操作,有以下几种实用方案:
一、直接用JPA生命周期注解(快速实现)
在实体类里添加生命周期回调方法,对应不同操作触发逻辑,适合简单场景:
@Entity @Data @SuperBuilder @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode(callSuper = false) @Table(name = "evaluation_form") @SQLDelete(sql = "UPDATE {h-schema}evaluation_form SET status = 0 WHERE id=? AND version = ?") @Where(clause="status <> 0") public class EvaluationForm extends ExPersistableEntity<String> { // 原有字段保留 @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid") private String id; private String code; @Column(columnDefinition = "nvarchar(255)") private String name; private String biddingCode; @Column(columnDefinition = "nvarchar(255)") private String biddingName; private String biddingType; private String biddingMethod; private String state; private String biddingForm; // 新增操作记录逻辑 @PrePersist private void logCreate() { // 这里替换成你的日志记录逻辑,比如插入操作日志表 System.out.println("新增EvaluationForm,ID:" + this.id); } @PreUpdate private void logUpdate() { System.out.println("编辑EvaluationForm,ID:" + this.id); } @PreRemove private void logDelete() { // 因为用了逻辑删除,调用remove方法时会触发这个回调 System.out.println("删除EvaluationForm,ID:" + this.id); } }
优点是快速上手,缺点是业务逻辑和实体类耦合度高。
二、Spring Data JPA Auditing(推荐解耦方案)
通过审计功能统一管理操作时间、操作人等信息,还能扩展记录操作类型:
- 先定义一个审计基类:
@MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class AuditableBase { @CreatedDate @Column(name = "create_time", updatable = false) private LocalDateTime createTime; @LastModifiedDate @Column(name = "update_time") private LocalDateTime updateTime; @CreatedBy @Column(name = "create_by", updatable = false) private String createBy; @LastModifiedBy @Column(name = "update_by") private String updateBy; // 针对逻辑删除新增字段 @Column(name = "delete_time") private LocalDateTime deleteTime; @Column(name = "delete_by") private String deleteBy; // 生成getter、setter }
- 修改
EvaluationForm继承这个基类:
// 原有注解不变 public class EvaluationForm extends AuditableBase { // 原有字段保留 }
- 配置操作人获取逻辑(如果需要记录操作人):
@Component public class CurrentAuditor implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { // 这里替换成从上下文获取登录用户的逻辑,比如Spring Security return Optional.of("当前登录用户名"); } }
- 在启动类添加
@EnableJpaAuditing开启审计功能。
如果要记录具体操作类型(新增/编辑/删除),可以结合@PrePersist、@PreUpdate在审计基类里补充标记逻辑,或者单独写日志服务。
三、自定义JPA事件监听器(完全解耦)
把操作记录逻辑抽成独立监听器,彻底和实体类分离:
- 编写监听器类:
@Component public class EvaluationFormOperationListener { // 注入你的日志服务 @Autowired private OperationLogService logService; @PrePersist public void onCreate(EvaluationForm entity) { logService.saveLog(entity.getId(), "新增", "evaluation_form", JSONObject.toJSONString(entity)); } @PreUpdate public void onUpdate(EvaluationForm entity) { logService.saveLog(entity.getId(), "编辑", "evaluation_form", JSONObject.toJSONString(entity)); } @PreRemove public void onDelete(EvaluationForm entity) { logService.saveLog(entity.getId(), "删除", "evaluation_form", JSONObject.toJSONString(entity)); } }
- 在实体类上绑定监听器:
@Entity @Data // 原有注解... @EntityListeners(EvaluationFormOperationListener.class) public class EvaluationForm extends ExPersistableEntity<String> { // 原有字段保留 }
这种方式适合复杂业务场景,代码职责更清晰。
内容的提问来源于stack exchange,提问作者Urrego Hector
相关产品推荐
相关产品推荐

