如何使用 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 应用程序?