如果数据库已在使用中,如何使用当前状态初始化Javers jv_snapshot?

时间:2017-03-24 17:07:22

标签: java hibernate spring-boot javers

我有一个已经填充的SQL数据库,我想在其中添加Javers审计。有没有办法在对特定对象运行初始更新之前使用当前对象状态初始化jv_snapshot表?我发现我丢失了以前的状态,因为jv_snapshot表包含更新状态作为初始状态。我正在使用hibernate / jpa运行一个spring boot应用程序。

3 个答案:

答案 0 :(得分:1)

根据数据库的大小,与Javers同步每条记录可能要花费数小时或数天,即使这些记录可能永远不会从“初始”状态更改。

可能不是您要找的东西,但对我有用。

 // UserService.java

 @Autowired
 private Javers javers;
 @Autowired
 private UserRepository userRepository;

 public void updateUser(UserDTO user){

      User existing = userRepository.findOne(user.getId());

      // Initial Commit Assuming This Record is Not Tracked by Javers Yet
      javers.commit("Initial", existing);

      // Update Logic ... 
      existing.setUpdatedTimestamp(LocalDateTime.now());
      userRepository.save(existing);
 }

 public void deleteUser(Long id){

      User existing = userRepository.findOne(id);

      // Initial Commit Assuming This Record is Not Tracked by Javers Yet
      javers.commit("Initial", existing);

      // Delete Logic ...
      userRepository.delete(id);
 }

 // UserRepository.java
 @Repository
 @Transactional
 @JaversSpringDataAuditable
 public interface UserRepository extends JpaRepository<User, Long>{}

使用上面的逻辑,您将始终在发生UPDATE或DELETE之前具有对象所处的初始状态。如果发生CREATE,Javers将自动捕获初始状态。

希望这会有所帮助。

答案 1 :(得分:0)

如果您询问某种数据迁移工具--JaVers并未提供任何数据迁移工具。我建议的仅是使用JaVers API,也用于批量更改。

答案 2 :(得分:0)

虽然可能有点晚了,但我希望这个答案有助于扩展Bartek建议做手册javers.commit()的建议,因为我遇到了同样的问题,而且解决方案非常简单。

基本上,我创建了一个可从特定控制器(例如InitialSnapshotJobController)调用的作业,该控制器公开了诸如/api/jobs/initialSnapshot之类的端点,例如

@GetMapping("/api/jobs/initialSnapshot")
public JobResult initialSnapshotJob(){...}

此工作引用了我要保留的实体的所有服务,例如

@Autowired
public InitialSnapshotJobController(Javers javers, FileService fileService, PriceService priceService){
    initialSnapshot();
}

在工作中,我只需对每个服务执行findAll(),迭代返回的所有项,然后手动将其提交给JaVers,例如

public void initialSnapshot(){
    List<File> files = fileService.findAll();
    files.forEach(file ->{
        javers.commit("InitialSnapshotJob", file);
    })
    ...
}

这可以按预期工作,现在我可以将将来的任何更改存储为更新,这使我可以只获取基线的更改,而无需为新对象设置JaVers标志。

您还可以修改作业以接收服务列表,而不是对其进行硬编码,然后,如果以后需要获取新实体的快照,则只能为该实体做一个快照。