【发布时间】:2015-02-17 08:12:18
【问题描述】:
问题: 如何检查带有@PreUpdate注解的方法中哪些字段已更改?
可选:如果上述问题的答案是“这是不可能的,那么也许还有其他方法可以解决我的问题”
我想要在我们每次更改时自动更新 modified Tourist 的字段。
除非我们修改location的情况。意味着如果我们只更改 location - 它应该被持久化,但不能更改 modified。
已经存在代码:
@Entity
public class Tourist {
private long id;
private String firstName;
private String lastName;
private Date created;
private Date modified;
private String location;
@PreUpdate
public void preUpdate() {
modified = new Date(); //PROBLEM : change modified even if only location field has been changed!
}
....
}
更新:经过一番调查,我发现我可以在拦截器的帮助下解决它(扩展EmptyInterceptor):
public class TouristInterceptor extends EmptyInterceptor{
Session session;
private Set updates = new HashSet();
public void setSession(Session session) {
this.session=session;
}
public boolean onFlushDirty(Object entity,Serializable id,
Object[] currentState,Object[] previousState,
String[] propertyNames,Type[] types)
throws CallbackException {
if (entity instanceof Tourist){
if (somethingChangedExceptLocation())
updates.add(entity);
}
return false;
}
但这种方法的缺点是在需要拦截单个实体时拦截所有内容。
更新问题:
- 如何仅拦截旅游实体刷新调用?
- 是否可以在事件的帮助下做同样的事情?表示
PreUpdateEvent包含新旧状态
【问题讨论】:
-
为什么不使用临时字段来存储以前的位置,并在更新前测试它,然后再更新
modified字段? -
我建议您创建一个边类,您可以在其中跟踪事件(创建、修改等),并在业务级别而不是 DAO 级别更新它
-
@Hichamov 我真的很喜欢你关于额外瞬态场的想法!
-
@Hichamov 但我需要检查其他字段是否未更改。请详细说明模式
-
对不起,我以前从未使用过。我可能说错了