我正在寻找最恰当的方法来检查通过Spring Data Rest管理的实体链在更新操作期间所做的更改。
我目前的用例是我想更新上次修改密码的时间。我的域对象有两个字段,密码和修改时间。我希望我的REST api只需要设置密码,我会检测它是否是新密码并更新修改时间。如果必须设置修改时间,我宁愿不知道我的前端。我也不想创建数据库触发器。
我尝试创建一个HandleBeforeSave
事件,尝试查询现有域对象并将其与传递给事件处理程序的域对象进行比较。不幸的是,它们是完全相同的对象,所以我无法检测它们之间的区别。我试过通过Spring Data存储库和EntityManager
进行查询。我正在使用Hibernate 5作为我的后端。
在patchItemResource
上单步执行RepositoryEntityController
方法时,payload.getContent()
的结果会反映整个实体,即使我只修补了一个字段,并应用了更新。我不知道这是由杰克逊完成还是PersistentEntityResource
在某处处理它。如果有人知道对象合并的代码流会有帮助吗?
答案 0 :(得分:1)
一种简单的方法是使用Entity Lifecycle侦听器在Entity加载时存储对先前状态的引用,并实现第二个侦听器以修改更新时的其他字段。
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.
}
}
}