Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 SpringDataREST:跟踪历史记录表中的数据更改_Java_Spring_Spring Data_Spring Data Rest - Fatal编程技术网

Java SpringDataREST:跟踪历史记录表中的数据更改

Java SpringDataREST:跟踪历史记录表中的数据更改,java,spring,spring-data,spring-data-rest,Java,Spring,Spring Data,Spring Data Rest,我想使用SpringDataREST使用历史记录表跟踪对数据的更改。我的预期行为是,对于更改数据的每个事务,一个条目将自动添加到我的历史记录表中。我不确定,但我认为在使用服务时,让事务跨越多个请求是无效的 我目前有两种选择: 1) 对数据使用数据库触发器——我在这里看到的缺点是,目前我们的大多数操作都是通过Java完成的,我看不到任何通过Java实现的方法 2) 使用带注释的事件处理程序-我们将为每个表的每个事件创建事件处理程序,以跟踪历史,我倾向于这样做,但我不确定这是否正确 两个选项中哪一个

我想使用SpringDataREST使用历史记录表跟踪对数据的更改。我的预期行为是,对于更改数据的每个事务,一个条目将自动添加到我的历史记录表中。我不确定,但我认为在使用服务时,让事务跨越多个请求是无效的

我目前有两种选择:

1) 对数据使用数据库触发器——我在这里看到的缺点是,目前我们的大多数操作都是通过Java完成的,我看不到任何通过Java实现的方法

2) 使用带注释的事件处理程序-我们将为每个表的每个事件创建事件处理程序,以跟踪历史,我倾向于这样做,但我不确定这是否正确


两个选项中哪一个更好?还有其他选项吗?

使用Spring Data Rest,您可以选择执行任何预处理和后处理。我相信原始事务边界适用于这些事件中的任何数据库操作。

使用Spring Data Rest,您可以选择执行任何预处理和后处理。我相信原始事务边界适用于这些事件中的任何数据库操作。

我知道我是在几年后回答这个问题的,但这里有另一种方法:

创建RepositoryEventHandler

@Component
@RepositoryEventHandler(Code.class)
public class CodesEventHandler {

    @Autowired
    private CodesRepository repository;

    @HandleBeforeSave
    public void handleBeforeSave(Code c) {
        // backup the existing data to history (happens to be on the same table)
        Code newC = new Code();
        BeanUtils.copyProperties(c, newC);
        CodeId newId = new CodeId();
        BeanUtils.copyProperties(c.getCodeId(), newId);
        newC.setCodeId(newId);
        Date now = new Date();
        newC.getCodeId().setValidToTs(now);
        repository.save(newC);

        c.setValidFromTs(now);

    }

    @HandleBeforeDelete
    public void handleBeforeDelete(Code c) {
        // same as above but this time set the end timestamp to be now
    }
}

我知道几年后我会回答这个问题,但这里有另一种方法:

创建RepositoryEventHandler

@Component
@RepositoryEventHandler(Code.class)
public class CodesEventHandler {

    @Autowired
    private CodesRepository repository;

    @HandleBeforeSave
    public void handleBeforeSave(Code c) {
        // backup the existing data to history (happens to be on the same table)
        Code newC = new Code();
        BeanUtils.copyProperties(c, newC);
        CodeId newId = new CodeId();
        BeanUtils.copyProperties(c.getCodeId(), newId);
        newC.setCodeId(newId);
        Date now = new Date();
        newC.getCodeId().setValidToTs(now);
        repository.save(newC);

        c.setValidFromTs(now);

    }

    @HandleBeforeDelete
    public void handleBeforeDelete(Code c) {
        // same as above but this time set the end timestamp to be now
    }
}

使用Envers审计操作

使用Envers审计操作

不知道您是否有JPA/Hibernate在后面,但是看看Hibernate Envers项目,如果没有其他项目的话,可以从中得到启发:是的,我们使用JPA/Hibernate来实现这一点。如果您已经在使用Hibernate,我肯定会推荐Hibernate Envers。设置和使用treat@Audited@AuditTable(value=“Transaction\u Audit”)@Table(name=“[Transaction]”)非常容易。不知道是否有JPA/Hibernate在后面,但是看看Hibernate envers项目,如果没有其他项目,可以从中获得灵感:是,我们使用的是JPA/hibernate,如果您已经在使用hibernate,我肯定会推荐hibernate envers。设置和使用treat@Audited@AuditTable(value=“Transaction\u Audit”)@Table(name=“[Transaction]”)非常容易