【问题标题】:How to properly apply PrePersist like logic using jpa/spring-boot如何使用 jpa/spring-boot 正确应用类似 PrePersist 的逻辑
【发布时间】:2014-12-19 08:44:59
【问题描述】:

以下模型有一个非常简单的用例

@Entity
@Table(name='Foo')
class Foo {
    @Id
    String id = UUID.randomUUID()    
    String bar
    Date foo_updated
}

当我看到传入的 json 有效负载具有“bar”的值时,我想将 foo_updated 值设置为 new Date()(即,这是 POST/PATCH 更新的一部分中包含的新值/ 在 PUT 中包含并证明是不同的)

我希望在此模型上简单地应用 @PrePersist 注释并添加一个简单的条件询问“bar”是否有效......但很快意识到我不知道该值是否与其中的值“不同”数据库已经(用于 PATCH/PUT 场景)。

我开始走上“添加我自己的 RestController”的道路,并在使用 spring 4 ResponseEntity 方法的过程中应用这个逻辑,但是......我觉得这最终可能需要更多的工作/更多的代码维护。

由于我是 spring-boot/spring-mvc/jpa 的新手,我很好奇我还有哪些其他选择,以及对于这个看似“简单”的要求,首选方法是什么

感谢您的帮助!

【问题讨论】:

    标签: spring spring-mvc jpa spring-boot


    【解决方案1】:

    我最近遇到了这种方法,它涉及记录加载时的先前状态。您现在可以在绑定新值后访问之前的状态。

    @Entity
    @Table(name='Foo')
    class Foo {
        @Id
        String id = UUID.randomUUID()    
        String bar
        Date foo_updated
    
        @Transient
        private Foo previousState;
    
        @PostLoad
        private void setPreviousState(){
            previousState = new Foo();
            //copy the fields
        }
    
    }
    

    但是在你的情况下你不能这样做:

    @Entity
    @Table(name='Foo')
    class Foo {
        @Id
        private String id = UUID.randomUUID()    
        private String bar
        private Date lastUpdated;
    
        public void setBar(String bar){
            if(! this.bar.equals(bar){
                lastUpdated = new Date();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 2018-12-30
      • 2020-03-30
      • 2021-05-30
      相关资源
      最近更新 更多