在更新操作中访问以前的实体

Access previous entity on update operations

我正在寻找最惯用的方法来检查更新操作期间通过由 Spring Data Rest 管理的实体链所做的更改。

我当前的用例是我想更新上次修改密码的时间。我的域对象有两个字段,一个密码和一个修改时间。我希望我的 REST api 只需设置密码,我将检测它是否是新密码并更新修改时间。我不想让我的前端知道它是否必须设置修改时间。我也不想创建数据库触发器。

我已经尝试创建一个 HandleBeforeSave 事件来尝试查询现有域对象并将其与传递给事件处理程序的对象进行比较。不幸的是,它们是完全相同的对象,所以我无法检测到它们之间的区别。我尝试通过 Spring 数据存储库和 EntityManager 进行查询。我使用 Hibernate 5 作为我的后端。

RepositoryEntityController 上逐步执行 patchItemResource 方法时,payload.getContent() 的结果反映了整个实体,即使我只修补了一个字段,并应用了更新。我不知道这是 Jackson 完成的还是 PersistentEntityResource 正在某处处理它。如果有人知道执行对象合并的代码流会有帮助吗?

一种简单的方法是使用实​​体生命周期侦听器来存储对实体加载前状态的引用,并实现第二个侦听器以在更新时修改其他字段。

https://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Events

 @Entity
 public class SomeEntity{

        @Transient
        private SomeEntity previousState;

        @PostLoad
        private void storeState(){
          previousState = new SomeEntity();
          previousState.setPassword(this.getPassword());  
        }

        @PreUpdate
        private void doBeforeUpdate(){
            if(!previousState.getPassword().equals(this.getPassword()){
                //update time.  
            }
        }
    }