插入弹簧批之前删除记录

时间:2018-10-19 13:47:27

标签: spring-batch

我做了很多研究,但找不到以下问题的解决方案。我们正在使用Spring批处理来处理用户及其组,并在另一个表中创建关联。 用例是当我们发现用户组已更改时,我们需要删除以前的关联并创建新的关联。

我如何使用spring batch来做到这一点,因为处理器只会返回一件物品

public T process(T source) throws Exception {
    LOG.info("Processing item: " + source);
    T target = null;
    //logic to find old and new group 

   if (!oldGroup.equals(newGroup)) {
        LOG.debug("Group Changed");

     //this is where I need to delete the old association and create a new one

    }

    return target;
}

2 个答案:

答案 0 :(得分:1)

项目处理器的返回类型可以不同于输入类型(转换数据类型是项目处理器的典型用例)。您可以使用的一种技术是:

  • 创建一个包装器类型,其中包含有关编写者应执行的操作的所有元数据,例如要删除的关联的ID,要创建的关联等。
  • 项目编写者可以读取此元数据并采取相应的行动

因此,在您的情况下,如果TUser,则项目处理器可能类似于:

public UserWrapper process(User source) throws Exception {
   LOG.info("Processing item: " + source);
   UserWrapper target = new UserWrapper(source);
   //logic to find old an new group 

  if (!oldGroup.equals(newGroup)) {
     LOG.debug("Group Changed");

     target.setAssociationToDelete(xxx);
     target.setAssociationToCreate(xxx);
     // set any information useful to take action

   }

   return target;
}

相应的作者将输入UserWrapper类型的条目,读取有关关联的信息以删除/创建并采取相应的行动。

您只需要为UserWrapper找到一个好名字即可。您知道,命名很难:-)

希望这会有所帮助。

答案 1 :(得分:0)

有不同的方法来做到这一点。这是我的建议。

  • 阅读器-读取用户记录
  • 处理器-过滤记录 不需要更新-if(oldGroup.equals(newGroup)){return null}
  • 作家- 删除并重新创建关联

如果在读取时只能选择需要更改的记录,则不需要处理器。

有关实现的详细信息,请参阅https://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html,如果您仍然需要任何帮助,请告知我们。