【问题标题】:Access previous entity on update operations在更新操作中访问先前的实体
【发布时间】:2016-09-23 17:35:51
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 1970-01-01
      • 2012-03-01
      • 2018-07-28
      • 2011-04-30
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多