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