即使 JPA 实体不脏,我是不是可以强制 spring-data 更新可审计字段?

Posted

技术标签:

【中文标题】即使 JPA 实体不脏,我是不是可以强制 spring-data 更新可审计字段?【英文标题】:Can I force spring-data to update auditable fields even if JPA entity not dirty?即使 JPA 实体不脏,我是否可以强制 spring-data 更新可审计字段? 【发布时间】:2015-12-28 10:07:57 【问题描述】:

我正在使用带有审计功能的 Spring-data-jpa。我本质上想“触摸”我的实体 - 即使我没有对对象进行任何更改,我也想更新 @LastModifiedDate 和 @LastModifiedBy 字段。

基本上,我希望将这两个字段改为“LastAccessedBy”和“LastAccessedDate”。

即使实体不脏,是否有办法触发 Spring 数据/JPA 将实体写入数据库(从而触发 Spring 数据审计模块)?

还是我唯一的选择是修改审计字段(例如:@LastModifiedDate),然后让 spring 用更新的值覆盖它?

【问题讨论】:

不会让行更新这些值? @WeareBorg 它不应该;如果是这样,我会认为这是一个错误。审计字段应该只在对象被持久化时更新。如果对象没有被持久化(因为它不脏),字段也不会被更新。 哦,我以为你只是想更新没有这个问题的字段,嗯.. 直接更新字段或获取对象后的触发器是我能想到的。我希望一些用户可能会了解更多。祝你好运。 字段和注释有不同的用途,不要滥用它来做其他事情,因为这只会造成混淆。如果你想要LastAccessedBy 等,那么为这种情况创建注释/字段,但不要滥用不适合它的东西。 改变行为的问题是您首先需要修改 Spring-Data 源。然后,这对我来说是一个主要问题,所有其他查看您的代码并看到此注释的开发人员都期望某种不再存在的行为。所以马丁是对的...... :-) 【参考方案1】:

不管怎样,当我想要更新此列时,我自己设置了lastModifiedDate,即使我知道我的实体并不脏。

entity.setLastModifiedDate(Instant.now());

该值将被@LastModifiedDate 注释覆盖,但至少我会拥有我想要的。

我的情况是:我有一个表来跟踪我的文件系统上的文件,需要处理一些功能规则,如果用户上传的文件与前一个文件同名,如果我不手动设置lastModifiedDate我不知道最后上传日期是什么。

(我知道我应该使用新的 md5 文件将我的实体设置为脏,但这会让我的经理太害怕)

【讨论】:

以上是关于即使 JPA 实体不脏,我是不是可以强制 spring-data 更新可审计字段?的主要内容,如果未能解决你的问题,请参考以下文章

标准 Jpa 选择外国实体

jpa 合并非托管实体

JPA / @PostPersist @PostUpdate - 事务

域对象是不是与 JPA 实体相同?

Spring Data+JPA:对 OneToOne 关系强制执行内部联接

使用 JPA 原生查询时是不是必须选择所有实体属性?