如何使用 jpa/spring-boot 正确应用类似 PrePersist 的逻辑

Posted

技术标签:

【中文标题】如何使用 jpa/spring-boot 正确应用类似 PrePersist 的逻辑【英文标题】:How to properly apply PrePersist like logic using jpa/spring-boot 【发布时间】: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 的新手,我很好奇我还有哪些其他选择,以及对于这个看似“简单”的要求,首选方法是什么

感谢您的帮助!

【问题讨论】:

【参考方案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();
        
    

【讨论】:

以上是关于如何使用 jpa/spring-boot 正确应用类似 PrePersist 的逻辑的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 IRegisteredObject 阻止应用程序域关闭/回收 Web 应用程序?

如何使用 Firebase 正确配置 Flutter 应用程序?

AppEngine NDB:如何正确应用祖先?

C# - 如何使用上下文菜单正确触发应用程序打开

如何在基于 Qt 的应用程序中正确使用 valgrind

如何使用应用引擎 Python webapp2 正确输出 JSON?