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

时间:2015-02-27 19:21:31

标签: grails spring-batch

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

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

因此,如果我的可能记录如下:

// 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),然后修改项目并在作者中调用save()

如何实施删除?如果我从我的LineMapper返回一个null,那么应用程序似乎停止了。我以为作者应该删除对象,而不是这个?或者我只使用findByKey(12345),然后传递给写入删除标志?

对基本问题表示歉意,这是使用框架的第1天。我有兴趣了解最佳实践。

1 个答案:

答案 0 :(得分:1)

你很亲密,但并不完全。你真正需要你的行映射器生成的是一个类的实例,它不仅包含要实现的域类的实例,还包含一个属性来指示需要采取的操作(可能是由项目处理器或分类项目)作家,取决于你的要求)。

这样的事情可能有用:

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