1

我们需要将复杂的数据结构从一个组织克隆到另一个组织。这包含一系列自定义 SObject,包括父母和孩子。

流程如下。在 origin org 上,我们只是 JSON.serialize 我们想要发送的 SObject 列表。然后,在目标组织上,我们可以 JSON.deserialize 该对象列表。到目前为止,一切都很好。

问题是我们无法直接插入这些 SObject,因为它们包含原始组织的 ID,而 Salesforce 不允许我们插入已经有 Id 的对象。

我们找到的解决方案是手动插入对象层次结构,维护 originId > targetId 的映射并手动修复关系。但是,我们想知道 Salesforce 是否提供了一种更简单的方法来做这样的事情,或者有人知道更好的方法来做这件事。

Salesforce 中是否有嵌入式方式来执行此操作?还是我们陷入了繁琐的手动过程?

4

1 回答 1

1

List.deepClone()使用preserveIds = false 调用可能会解决一个问题,然后:

考虑使用 upsert 操作为您建立关系。Upsert 不仅可以防止重复,还可以保持层次结构。您需要在父级上使用外部 Id 字段,而不是在子级上。

/* Prerequisites to run this example succesfully:
    - having a field Account_Number__c that will be marked as ext. id (you can't mark the standard one sadly)
    - having an account in the DB with such value (but the point of the example is to NOT query for it's Id)
*/
Account parent = new Account(Account_Number__c = 'A364325'); 
Contact c = new Contact(LastName = 'Test', Account = parent);
upsert c;

System.debug(c);
System.debug([SELECT AccountId, Account.Account_Number__c FROM Contact WHERE Id = :c.Id]);

如果您不确定它是否适合您 - 使用 Data Loader 的 upsert 功能,可能有助于理解。

如果您在同一个 sObject 类型上有超过 2 个级别的层次结构,我认为您仍然必须以正确的顺序更新它们(或使用Database.upsert版本并继续为失败的版本重新运行它)。

于 2012-10-27T09:21:45.420 回答