gpt4 book ai didi

database - 具有插入或更新机制的Spring批处理自定义itemWriter

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:38 26 4
gpt4 key购买 nike

我有一个带有基本 block 的 Spring Batch:

  1. 读取 CSV 文件。
  2. 对其进行处理(将一些编码值转码为另一个编码值)。
  3. 将结果写入数据库。

问题

在某些情况下,我想在我的自定义 ItemWriter 中插入或更新机制。

示例:我可以在我的 CSV

中获取这两行
C006;Test;OK;01/01/1970;1
C006;Test;OK;01/01/1970;5

除了最后一列,你可以发现它们非常相似,策略将是:

  1. 如果我有一个“像这样”的实体,请检查数据库
  2. 如果为真,则使用您获得的最后一项更新该值(在我们的例子中,第二行最后一列中的值为 5)

我已经做了什么?

在我的实体 bean 中,我添加了一个 Unique Constraint 注释,如下所示:

@Table(name = "indicator",
uniqueConstraints = { @UniqueConstraint(columnNames =
{ "reference", "type", "status", "date" }) })

我现在确定我不能持久化具有相同列数据的实体。然后,我创建了一个自定义的 ItemWriter,我试图捕获 ConstraintViolationException 但它没有用,我总是得到另一个异常,即使我尝试了父异常.

那么你有什么想法或其他方法吗?

我考虑过使用合并 JPA 功能吗?你怎么看?

我的自定义 ItemWriter

@Component
public class ImportItemWriter implements ItemWriter<Indicator>{

@Autowired
protected IndicatorDao indicatorDao;

public void write(List<? extends Indicator> items) throws Exception {

for (Indicator item : items) {
Indicator indicator = new Indicator();

indicator.setReference(item.getReference());
indicator.setType(item.getType());
indicator.setStatus(item.getStatus());
indicator.setDueDate(item.getDueDate());

indicator.setValue(item.getValue());

try {
indicatorDao.persist(indicator);
} catch (ConstraintViolationException e) {
// TODO: handle exception
}
}
}
}

更新问题已解决使用 Composite PKey 的想法很有趣,但我不能使用它,因为我必须创建一个具有 9 个键的组合,这在性能方面不公平。我决定向我的 DAO 添加函数(isDuplicated),在我的自定义 ItemWriter 中,我只做一个简单的测试:

if `isDuplicated()` then `updateEntity()` else `insertNew()`

最佳答案

一种选择是使用 ClassifierCompositeItemWriterClassifier 将用于确定是执行插入还是更新。然后您将配置两个委托(delegate),一个用于插入,一个用于更新。

关于database - 具有插入或更新机制的Spring批处理自定义itemWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25916451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com