我有一个要求,我必须检测并保存实体类的最后保存和新更改之间的字段级增量,通过JSF
前端修改。 IOW,表单,实体类和数据库表可能有X个字段,每次保存时,0到X之间的任何地方都可以更改。我需要在每次保存时找到所有已更改的内容并将其记录在某处以供审核。
起初我想过修改每个二传手:
@Transient
private Set<String> changes;
...
public void setSomeField(String _newval) {
if(!_newval.equals(this.someField)){
this.changes.add("SOME_FIELD");
}
this.someField = _newval;
}
这需要在每个setter中实现这种非优雅的delta检测逻辑,我不喜欢它。是否有一种简单的方法可以使用一些JPA
函数将新状态从持久状态中区分出来,这将为我提供所有字段更改的列表,然后我可以将其转储到审计日志存储中?
答案 0 :(得分:0)
听起来像一个完美契合的拦截器与注释相结合。创建一个,注释实体(classlevel会很棒,但我认为方法级别(setter)是可以接受的)并且所有工作都是自动完成的。什么以及何时记录结果取决于您,但这可能在实体过程中。
但为什么不使用Envers呢?它完全是这一切(afaik jpa implementation independent)