Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 列出上次保存和新建之间的实体类字段级增量的最简单方法_Java_Jpa_Entity - Fatal编程技术网

Java 列出上次保存和新建之间的实体类字段级增量的最简单方法

Java 列出上次保存和新建之间的实体类字段级增量的最简单方法,java,jpa,entity,Java,Jpa,Entity,我有一个要求,根据这个要求,我必须检测并保存实体类最后保存的更改和新更改之间的字段级增量,该实体类是通过JSF前端修改的。IOW,表单、实体类和DB表可能有X个字段,并且在每次保存时,可以更改0到X之间的任何位置。我需要在每次保存时找到所有发生更改的内容,并将它们记录在某个地方,以便进行审计 起初,我想修改每个setter: @Transient private Set<String> changes; ... public void setSomeField(String _n

我有一个要求,根据这个要求,我必须检测并保存实体类最后保存的更改和新更改之间的字段级增量,该实体类是通过JSF前端修改的。IOW,表单、实体类和DB表可能有X个字段,并且在每次保存时,可以更改0到X之间的任何位置。我需要在每次保存时找到所有发生更改的内容,并将它们记录在某个地方,以便进行审计

起初,我想修改每个setter:

@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函数将新状态与持久化状态区分开来,该函数会给我一个所有字段更改的列表,然后我可以将其转储到我的审核日志存储中?

听起来非常适合将拦截器与注释结合使用。创建一个,注释实体类级别会很好,但是我认为方法级别设置器是可以接受的,并且所有的工作都是自动完成的。记录结果的内容和时间取决于您,但这可能在entitylistener中


但是为什么不使用它呢?当然,所有这些都是独立于afaik jpa实现的

您可以提供一些代码示例来说明如何做到这一点吗?在我假设它类似于aspectYes之前,我没有使用过拦截器。是的,它是“类似aspects”。但我编辑了我的答案,并引用了我曾经想用的东西。还有一个例子,关于如何创建拦截器,不止一个是通过google bet stackoverflow创建的,还有一些关于现代拦截器的介绍性例子,必须是通用jpa吗?