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
}
我正在考虑使用 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
}