我目前正在尝试通过xml(在TemplateParser中调用inputFiles)将大量数据插入到我的存储库中。但是,当单个记录抛出错误(如键约束)时,将不再处理任何记录。我知道清理数据以便不插入坏行会很好,但是因为我无法在测试环境中一致地控制我们的数据子集,所以我无法保证外部约束引用的表将具有一致的数据
如果我将整个内容包装在一个事务中,那么就不会插入任何记录,如果我用import-items包装它会因为表上的空约束而失败(import-items尝试插入部分记录)。将每个元素包装在它自己的事务中并不会捕获错误,并且它会将每一行插入到坏行但后面没有任何内容。
还有另一种方法可以在将数据导入存储库时允许在错误情况下恢复吗?或者在插入之前检查gsa-template中的约束的方法?
供参考的文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE gsa-template SYSTEM "dynamosystemresource:/atg/dtds/gsa/gsa_1.0.dtd">
<gsa-template>
<transaction>
<add-item item-descriptor="vendorSku">
<set-property name="skuItem"><![CDATA[0065-OC-OS]]></set-property>
<set-property name="vendorSkuId"><![CDATA[853-6520]]></set-property>
<set-property name="vendorItem"><![CDATA[781]]></set-property>
</add-item>
<add-item item-descriptor="vendorSku">
<set-property name="skuItem"><![CDATA[0189-CRGONET-ONSI]]></set-property>
<set-property name="vendorSkuId"><![CDATA[8007146]]></set-property>
<set-property name="vendorItem"><![CDATA[76]]></set-property>
</add-item>
etc..
</gsa-template>
答案 0 :(得分:0)
据我所知,到目前为止,如果不重载内部ATG方法,就无法做到这一点。但是我确实发现将数据插入存储库对于错误数据,重复数据等更具弹性...如果您在更新期间显式设置了项目描述符,而不是允许存储库执行此操作。
所以在上面的例子中,如果vendorSku的id字段是skuItem,则可以将insert语句修改为:
<add-item item-descriptor="vendorSku" id="0189-CRGONET-ONSI">
<set-property name="vendorSkuId"><![CDATA[8007146]]></set-property>
<set-property name="vendorItem"><![CDATA[76]]></set-property>
</add-item>
这样,如果文件被多次添加,它将更新现有记录,而不是因为重复而抛出错误。对于相同的行为,您还可以使用<update-item>
标记并将add标志设置为true。