@CreatedDate 和 @LastModifiedBy 是怎么填上的?批量更新会不会更新修改时间?异步线程里用户怎么没了?忘了开 @EnableJpaAuditing 会报错吗?这篇在 Spring Boot 4.0.8、Hibernate 7、MySQL 上逐个实测。
save(new Doc) 之后:Doc[t1 创建 11:38:07.780801 by alice,修改 11:38:07.780801 by alice]
SQL:insert into doc (created_by,created_date,last_modified_by,last_modified_date,title) values (?,?,?,?,?)
SQL:update doc set last_modified_by=?,last_modified_date=?,title=? where id=?
bob 修改之后:Doc[t1-改 创建 11:38:07.780801 by alice,修改 11:38:08.925469 by bob]@EnableJpaAuditing 加 @EntityListeners 加四个注解;更新只改 last_modified_*。
把标题改成同样的值(脏检查没发现变化):Doc[t1-改 创建 11:38:07.780801 by alice,修改 11:38:08.925469 by bob] 只读取不修改,发出的 update 条数:0 @Modifying 批量 update 改了标题(carol 操作):Doc[批量改 创建 11:38:07.780801 by alice,修改 11:38:08.925469 by bob]——lastModified 仍是旧的,lastModifiedBy 仍是 bob 实体方式再改一次(carol 操作):Doc[再改一次 创建 11:38:07.780801 by alice,修改 11:38:10.067201 by carol]
同值修改、只读取和批量 JPQL 更新都不会更新审计字段。
没有当前用户(AuditorAware 返回 Optional.empty())时 save:Doc[无登录用户 创建 11:38:10.070898 by null,修改 11:38:10.070898 by null] 注解齐全但实体没有 @EntityListeners(AuditingEntityListener.class):DocNoListener[createdDate=null,createdBy=null]
没有当前用户或缺监听器时审计字段为 null,不报错。
alice 的线程里调用,但 save 在线程池的线程里执行:Doc[在另一个线程里保存 创建 11:38:10.077368 by null,修改 11:38:10.077368 by null](AuditorAware 读的是 ThreadLocal) 在任务里自己把用户设置到那个线程:Doc[线程里先设置用户 创建 11:38:10.079174 by carol,修改 11:38:10.079174 by carol]
AuditorAware 读 ThreadLocal,线程池里的 save 读不到用户。
save 之后:Doc[t0 创建 null by null,修改 null by null](实体上有 @EntityListeners 与注解,但没开 @EnableJpaAuditing)
缺 @EnableJpaAuditing 也是静默不填。