如何使用JPA /弹簧引导正确应用PrePersist像逻辑(How to properly app

2019-10-21 04:28发布

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

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

我想设置foo_updated值到新的Date()当我看到传入的JSON有效载荷中是否有“酒吧”(值即 - 这是包含在POST /补丁更新的一部分/包括和新价值被证明是在PUT不同)

我希望能简单地套用这个模型的@PrePersist批注,并添加一个简单的条件,询问是否“酒吧”是有效的...但很快就意识到,我不知道如果值是从“不同”是什么在DB已经(对于PATCH / PUT场景)。

我开始下跌之路“添加自己的RestController”,并在使用弹簧4 ResponseEntity方式的道路上应用此逻辑,但是...我觉得这可能最终会被大量的工作/更多的代码维护。

由于我是新来的春天启动/弹簧MVC / JPA我很好奇,我有什么其他的选择,什么是首选的方法将是这个看似“简单”的要求

谢谢您的帮助!

Answer 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();
        }
    }
}


文章来源: How to properly apply PrePersist like logic using jpa/spring-boot