Spring Boot审计最佳实现:@PrePersist与@PostPersist该如何选择?
结论
你的审计场景优先选择@PostPersist,原因如下:
@PrePersist触发时机是实体插入数据库之前,此时如果你的实体主键是靠数据库自增、序列等方式生成的,还没有被回填到实体对象中,审计记录需要关联操作实体ID的话根本拿不到有效值。更严重的问题是如果后续实体持久化失败(比如字段校验不通过、数据库约束冲突),你提前写入的审计记录就变成了和实际业务不匹配的脏数据。@PostPersist触发时机是实体插入数据库操作成功之后、事务提交之前,此时实体已经完成持久化,自动生成的主键已经正常回填,你可以直接拿到实体ID绑定到审计记录上;同时只有实体确实存入数据库才会触发审计记录写入,完全避免业务操作失败、审计记录多记的不一致问题。
额外注意
你当前写的AuditListener直接用@Autowired注入AuditRepository是不会生效的,因为JPA的EntityListener默认是JPA框架自己实例化的,不归Spring容器管理,你需要额外做配置把Listener交给Spring托管才能正常注入依赖。如果是基础的字段审计需求,也可以直接用Spring Data JPA自带的@EnableJpaAuditing配合@CreatedBy、@CreatedDate等注解实现,不需要自己手写Listener。
只有当你的审计逻辑不需要关联实体ID,也能接受操作失败时多生成审计记录的情况,才需要选择@PrePersist,其余绝大多数业务审计场景@PostPersist都是更合理的选择。
内容的提问来源于stack exchange,提问作者java dev
相关产品推荐
相关产品推荐

