Grails Spring 批处理 - 记录格式的 CRUD 模式(如何实现删除)

Grails Spring Batch - pattern for CRUD from record format (how to implement Delete)

我正在考虑使用 Grails Spring Batch 插件在 Grails 中使用 Spring Batch。

如果我有许多引用输入文件中实体的固定长度记录,其中该记录的一部分指示该记录是新项目、应更新的现有项目还是应更新的现有项目被删除,集成到 Spring 批处理模式的最佳模式是什么?

所以如果我可能的记录是这样的:

// create new record of type AA, data is 12345
AAN12345 

// update record of type AA, data is 12345 (assume that the data is the key and I can find the existing AA item using this key)
AAU12345

// delete record of type AA using 12345 as the key
AAD12345

我对 LineMapper 很满意,它从 FlatFileItemReader 获取一行并创建一个新项目并将其传递给编写器以进行保存。

LineMapper 可能看起来像:

class AaLineMapper implements LineMapper<AaItem> {

    @Override
    AaItem mapLine(String line, int lineNumber) throws Exception {
        switch (line[0..1]) {
            case 'N':
                AaItem item = new AaItem()
                // set fields here based on line
                return item
                break

            case 'U':
                // possibly this?
                AaItem item = AaItem.findByKey(someValueWithinLine)
                // set fields here based on line
                return item
                break

            case 'D':
                // not sure on this one, deleting and returning null doesn't seem to work
                // I thought the writer should delete the object?
                break
        }
    }
}

但是,对于更新,我是否认为最好的方法是在 LineMapper 中使用 Item.findByKey(12345),然后修改 Item 并在 writer 中调用 save()

如何实现删除?如果我 return 来自 LineMapper 的 null 那么应用程序似乎停止了。我认为作者应该删除对象,而不是这个?还是我只使用 findByKey(12345),然后传递给设置了删除标志的作者?

抱歉这个基本问题,这是使用框架的第一天。我有兴趣了解最佳实践。

你很接近,但还不够。你真正需要你的线映射器产生的是一个 class 的实例,它不仅包含要生效的域 class 的实例,而且还包含一个 属性 来指示需要采取什么行动采取(大概由项目处理者或 class 化项目作者,取决于您的要求)。

所以这样的事情可能会奏效:

class MyActionContainerClass {
  Object target
  String actionType // U, D, N
}