在更新操作上访问上一个实体

时间:2016-05-25 22:17:40

标签: java spring jpa spring-data spring-data-rest

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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.  
            }
        }
    }