2012-08-10 47 views
1

我們需要將複雜的數據結構從一個組織克隆到另一個組織。這包含一系列定製的SObjects,包括父母和孩子。我可以將來自其他Salesforce組織的反序列化JSON SObjects插入到我的組織嗎?

流程如下。在原始org上,我們只是JSON.serialize我們要發送的SObjects的列表。然後,在目標org上,我們可以對該對象列表進行JSON.deserialize。到現在爲止還挺好。

問題是,我們無法直接插入這些SObjects,因爲它們包含原始組織的ID,並且Salesforce不會讓我們插入已具有ID的對象。

我們找到的解決方案是手動插入對象層次結構,維護originId> targetId的映射並手動修復關係。然而,我們想知道Salesforce是否提供了一種更簡單的方法來做這樣的事情,或者有人知道更好的方法來做到這一點。

Salesforce中是否有嵌入式方法來執行此操作?還是我們陷入了一個乏味的手動過程?

回答

1

List.deepClone()電話與preserveIds = false可能會解決一個問題,那麼:

考慮使用UPSERT操作來建立你的關係。 Upsert不僅可以防止重複,而且還可以maintain hierarchies。 你需要一個外部的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類型上有兩個以上的層次結構,我認爲你仍然必須按照正確的順序放置它們(或使用Database.upsert版本並繼續重新運行失敗的版本)。